среда, 13 августа 2014 г.

Ruby. Specific features. Специфические особенности

Ruby - интерпретируемый динамичный язык программирования высокого уровня, пришедший к нам из далекой утонченной страны Японии (Аниме!!!!!). Его так же сложно понять, как и умы японцев. Взгляните только на это:
http://www.youtube.com/watch?v=V3j4Y3InMHc

Рассказывать я буду не про достоинства и недостатки Ruby, а про характерные особенности, незнания которых могут привести к серьезным ошибкам. (Если рассуждать про достоинства и недостатки, начнется безудержный холивар)

1. ООП от головы до пят


Ruby - полностью объектно-ориентированный язык. Это означает, что все данные в нем являются объектами, в отличие от многих языков программирования с примитивными типами. Каждая функция - метод какого-то класса.

"Ruby".class
=> String 
1.class
=> Fixnum
123.to_s
=> "123"

Как видите, даже численные примитивы являются объектами со своим набором методов. Даже true и false являются объектами классов TrueClass и FalseClass

2. Правда и ложь. Объект nil


В Руби всего два объекта обладают булевым значением false. Это объект false и объект nil (не NULL, как во многих других языках!). Все остальные объекты являются эквивалентами булевого значения true. Это означает, что число 0 так же является эквивалентом значения true!

if 0
   print "0 is true"
end
0 is true => nil

if !nil
   print "nil object is false"
end
nil object is false => nil

if !false
   print "false object is false"
end
false object is false => nil

3. Объекты передаются по ссылке


В Ruby методы получают ссылку на объект, а не копию его значения. Это означает, что изменение объекта внутри метода повлечет за собой его изменение в вызывающем контексте. В Ruby это называется вызов по соиспользованию (объект является рязделяемым, или используемым совместно).

ЗАМЕЧАНИЕ: Присвоение значения аргументу в методе не повлечет за собой никаких изменений в вызывающем контексте. Присвоение значений компонентам аргумента - повлечет.

Заключение


Если хотите узнать больше, переходите сюда, изучайте и достигайте просвещения.

вторник, 12 августа 2014 г.

VSFTPD. File Permissions

Основные сведения


1. Когда пользователь системы Linux создает файл, он автоматически наделяется стандартным набором разрешений (permissions).

2. Стандартный набор разрешений определяется разностью двух параметров: режима доступа (access mode) и пользовательской маски (umask - user mask).

3. По умолчанию режим доступа для создаваемых файлов имеет значение 666 (разрешены чтение и запись для всех), а для директорий - 777 (разрешены чтение, запись и исполнение для всех).

4. Для обычных пользователей umask равен 002, для root - 022.

Исходя из вышеперечисленного все создаваемые обычными пользователями файлы имеют разрешения 664, а папки 775 (Для root - 644 и 755 соответственно).

umask в vsftpd


В VSFTPD umask имеет значение по умолчанию 077. Это означает, что переданный по ftp файл будет иметь разрешения 600 (чтение и запись для пользователя, и не для кого другого).

Управлять разрешениями переданных файлов можно с помощью изменения umask для ftp сервера. Для этого откройте файл /etc/vsftpd.conf
sudo vim /etc/vsftpd.conf

И измените/добавьте параметр local_umask:
local_umask=007

После этого перезагрузите ftp сервер:
sudo restart vsftpd

В данном случае я изменил маску на 007. Таким образом на переданные файлы даются разрешения чтения и записи для пользователя и пользователей его группы (666 - 007 = 660).

воскресенье, 10 августа 2014 г.

Changing the Primary Key in Ruby on Rails Models

Здесь рассмотрено, как изменить тип и имя первичного ключа в модели Ruby On Rails.

Введение


По умолчанию, в любой создаваемой таблице в Ruby On Rails, первичным ключом является автогенерируемое поле :id типа integer. Это поле можно изменить как на этапе создания таблицы, так и в любое время после этого.

1. Файл миграции


Создадим модель пальцев (Finger). После выполнения команды rails generate model создастся файл миграции. Подправим его перед выполнением rake db:migrate:

class CreateFingers < ActiveRecord::Migration
  def change
    create_table :fingers, id: false do |t|
      t.string :name, null: false
      t.float :length

      t.timestamps
    end

    reversible do |dir|
      dir.up do
        execute "ALTER TABLE fingers ADD PRIMARY KEY (name);"
      end
      dir.down do
        execute "ALTER TABLE fingers DROP CONSTRAINT fingers_pkey;"
      end
    end
  end
end

То же самое можно проделать с уже существующей таблицей, удалив поле :id и добавив свое поле, которое будет первичным ключом:

class ChangePrimaryKeyInFingers < ActiveRecord::Migration
  def change
    remove_column :fingers, :id
    add_column :fingers, :name, :string
    reversible do |dir|
      dir.up do
        execute "ALTER TABLE fingers ADD PRIMARY KEY (name);"
      end
      dir.down do
        execute "ALTER TABLE fingers DROP CONSTRAINT fingers_pkey;"
      end
    end
  end
end

2. Модель


Подправим модель, указав в ней первичный ключ:
class Finger < ActiveRecord::Base
  self.primary_key = :name
end

3. Заключение


Все готово. Мы настроили свой первичный ключ в модели. Теперь можно использовать его в качестве внешнего ключа в других таблицах так же, как в случае стандартного первичного ключа (Создав поле с именем finger_id).



четверг, 7 августа 2014 г.

Виртуальные пользователи в VSFTPD

За основу взяты статьи:

Перед нами стоит задача предоставить множеству пользователей доступ по FTP, при этом не создавая для этого реальных пользователей. Эти пользователи не находятся в файлах /etc/passwd и /etc/shadow. Ко всему этому, все пользователи будут работать на сервере от одного реального пользователя, к примеру www-data или ftp. Управление доступом к папкам будут регулироваться на уровне установленных прав для директорий. Ни один из пользователей не уйдет дальше своей папки.
Не пугайтесь большого количества действий - все довольно просто. Приступим.

Примечание: в этой статье используется FTP сервер vsftpd.

Если у вас не установлен FTP сервер, установите его по этой инструкции:

1. База данных пользователей


Для создания базы виртуальных пользователей, нужна будет Berkeley DB. Для начала нужно узнать доступную версию. Для этого вводим в командной строке:
sudo apt-cache search db | grep Berkeley

И ищем строчку, похожую на:
db5.3-util - Berkeley v5.3 Database Utilities

Выбираем самую последнюю версию и устанавливаем:
sudo apt-get install db5.3-util

2. Список пользователей


Пользователи являются виртуальными, но их использование будет производиться от лица реального пользователя. Создадим его и папку для виртуальных пользователей:
sudo mkdir /home/ftp
sudo useradd -d /home/ftp ftpadmin
sudo passwd ftpadmin
sudo chown ftpadmin /home/ftp

Для того, чтобы создать Berkeley DB базу данных виртуальных пользователей, сперва необходимо подготовить список пользователей и паролей в текстовом файле. Формат файла очень прост. Каждая запись базы данных состоит из пары «ключ, значение», где ключом является имя учётной записи виртуального пользователя, а значением — его пароль. Каждая пара разбита на две строки: первая строка — ключ (имя пользователя), вторая — значение (пароль пользователя). Для примера создадим следующий файл vsftpdusers в директории /etc/vsftpd/:
sudo mkdir /etc/vsftpd
sudo touch /etc/vsftpd/vsftpdusers
#Читать и изменять файл сможет только root
sudo chmod 0600 /etc/vsftpd/vsftpdusers

Запишем в него информацию о пользователях. sudo vim vsftpdusers:
user1
password1
user2
password2

Для каждого пользователя создаем папки в нужной директории. К примеру, у меня это /home/ftp:
sudo mkdir /home/ftp/user1
sudo mkdir /home/ftp/user2

Указываем владельца папок, от которого будет осуществляться работа пользователей на сервере:
sudo chown ftpadmin:ftpadmin /home/ftp/user1
sudo chown ftpadmin:ftpadmin /home/ftp/user2

Остается создать базу пользователей из созданного выше текстового файла:
#Создаем DB
sudo db5.3_load -T -t hash -f /etc/vsftpd/vsftpdusers /etc/vsftpd/users.db
#Устанавливаем права ради безопасности. Читать и изменять файл сможет только root
sudo chmod 0600 /etc/vsftpd/users.db


3. Конфигурация VSFTPD


Редактируем файл настроек vsftpd:
sudo vim /etc/vsftpd.conf
Это минимальный набор параметров, необходимый для работы с нашими требованиями:
# Активирум сервис. Если используется xinetd, то выставить NO
listen=YES
# Отключаем вход от анонимного пользователя
anonymous_enable=NO
# Разрешение подключаться локальным и виртуальным пользователям
local_enable=YES
# Работа с виртуальными пользователями
user_sub_token=$USER
# Путь к домашним каталогам виртуальных пользователей
local_root=/home/ftp/$USER
# Не даём вылазить за пределы своего домашнего каталога пользователям
chroot_local_user=YES
# Скрываем реальные ID пользователей работающих на сервере
hide_ids=YES
# Все виртуальные пользователи работают как гостевые
guest_enable=YES
# Настоящее имя пользователя, от которого работают гостевые
guest_username=ftpadmin
# Виртуальные пользователи пользуются такими же привилегиями, что и локальные
virtual_use_local_privs=YES
# Глобальное разрешение операций записи
write_enable=YES
allow_writeable_chroot=YES
# Разрешаем работать в пассивном режиме
pasv_enable=YES
pasv_max_port=65535
pasv_min_port=32768
# Имя службы PAM
pam_service_name=vsftpd.virtual

Создадим новую службу авторизации для vsftpd. В каталоге /etc/pam.d создаем файл с именем указанным в vsftpd.conf в пункте pam_service_name
sudo vim /etc/pam.d/vsftpd.virtual

Заполняем файл следующим содержимым, где указываем на созданную нами базу без её расширения:
auth        required    pam_userdb.so db=/etc/vsftpd/users
account     required    pam_userdb.so db=/etc/vsftpd/users
session     required    pam_loginuid.so
Все настройки завершены. Осталось перезапустить сервис:
sudo vsftpd restart
Для заметки:
Более подробно ознакомиться с параметрами файла vsftpd.conf можно на www.lissyara.su

Настройка и использование FTP-сервера в Ubuntu Linux

За основу взяты статьи:

Почти каждый пользователь, работающий в сети интернет, сталкивался хотя бы раз с FTP. Здесь описано, как установить FTP сервер на машину и обеспечить его безопасность.

Мы будем использовать легкий и эффективный FTP-сервер vsFTPd, предназначенный для работы на высоконагруженных серверах. Далее в этой статье мы будем говорить просто об FTP-сервере, подразумевая vsFTPd.

1. Что такое FTP


FTP расшифровывается как File Transfer Protocol - протокол передачи данных. Название подразумевает, что этот протокол используется для передачи файлов или директорий с одного хоста на другой по сети - как локальной, так и через интернет.

2. Установка FTP-сервера в Ubuntu


Чтобы установить vsftpd откройте консоль и выполните команду:
sudo apt-get install vsftpd

После выполнения этой команды сервер будет установлен и запущен.
Setting up vsftpd (2.3.5-1ubuntu2) ...
vsftpd start/running, process 1891

3. Варианты запуска службы FTP


vsftpd может быть запущен тремя различными способами. Первый способ - запуск через inetd. Второй - через xinetd, третий - запускать сервер вручную (автономный режим).

По умолчанию vsftpd запускается в автономном режиме, в котором запускаемая на сервере служба использует собственный стартовый скрипт, называемый демоном. В случае vsftpd это /etc/init.d/vsftpd. Данный автономный демон в момент старта службы FTP берет управление нею на себя. Демон vsftpd предоставляет администратору несколько команд для управления FTP-сервером vsftpd:

start или stop - используется для запуска или остановки ftp-сервера.
status - выводит подробную информацию о текущем состоянии вашего FTP-сервера.
restart - это альтернатива последовательности из остановки и запуска сервера. Если сервер уже остановлен, команда restart запустит его.
reload - эта команда позволяет перезагрузить и применить все новые настройки. Ее отличие от restart заключается в том, что применение новых настроек производится без остановки сервера.
Чтобы выполнить данные команды, напечатайте:
sudo start/stop/status/restart/reload vsftpd

Однако автономный режим менее гибкий, inetd старый, так что рекомендуется запускать vsftp через xinetd. В нем есть такие вещи как регистрация запросов, контроль доступа, привязка сервиса к определенному сетевому интерфейсу и т.д.

4. Запуск службы FTP через xinetd


Устанавливаем суперсервер xinetd:
sudo apt-get install xinetd

Приведенная выше команда устанавливает и запускает суперсервер xinetd. В случае, если он у вас уже установлен, эта команда не нужна. Далее, создайте файл vsftpd в директории /etc/xinetd.d/ со следующим содержимым:
service ftp
{
        disable                 = no
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/sbin/vsftpd
        per_source              = 5
        instances               = 200
        no_access               = 10.1.1.10
        banner_fail             = /etc/vsftpd.busy
        log_on_success          += PID HOST DURATION
        log_on_failure          += HOST
}


В то же время вы можете изменять любые опции, чтобы настроить суперсервер в соответствии со своими требованиями.
Опции, на которые стоит обратить внимание:
server - введите в командной строке "$ which vsftpd", чтобы узнать правильный путь.
no_access - все хосты с IP-адресами, указанными в этой директиве, будут блокированы.
banner_fail - здесь можно указать путь к текстовому файлу, содержимое которого будет показано для любых блокированных IP-адресов.

Далее нам необходимо отредактировать конфигурационный файл FTP-сервера /etc/vsftpd.conf, заменив строку
listen=YES
на
listen=NO

Эта директива даст команду FTP-серверу не открывать никаких портов, полностью перепоручив их суперсерверу xinetd. Перед тем, как запустить сервер в нормальном режиме, убедитесь, что демон vsftpd отключен:
sudo service vsftpd stop

Теперь можно запустить FTP-сервер с помощью команды:
sudo service xinetd restart

Чтобы убедиться в нормальной работе FTP-сервера, протестируйте и откройте порт 21 с помощью команды netstat:
$ netstat -ant | grep 21tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

5. Настройка FTP сервера


Настройка vsftpd производится внесением изменений в конфигурационный файл /etc/vsftpd.conf.

Примечание: при внесении любых изменений в настройки FTP-сервера не забудьте воспользоваться командой restart/reload, чтобы активировать их.

5.1 Настройка пользовательского доступа

vsftpd позволяет предоставить либо анонимный доступ, либо пользователям из файла /etc/passwd, либо из своего собственного списка.

Анонимный доступ

Примечание: Открывать анонимный доступ опасно, а анонимный доступ без пароля еще опаснее. Это плохая идея. Лучше не делайте так, а просто почитайте для справки.

Чтобы предоставить анонимный доступ, в конфигурационном файле задайте директиве anonymous_enable значение YES:
anonymous_enable=YES

Для доступа без пароля дополнительно пропишите:
no_anon_password=YES

Теперь доступ к FTP серверу можно получить через пользователя anonymous. Для этого просто введите команду ftp с аргументом localhost или ip адресом вашего сервера:

$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.3.5)
Name (localhost:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp> quit
221 Goodbye.

Доступ локальных пользователей

Чтобы позволить авторизоваться всем пользователям, указанным в файле /etc/passwd, необходимо изменить значение директивы local_enable в файле /etc/vsftpd.conf.
local_enable=YES
Теперь любой пользователь, указанный в файле /etc/passwd, сможет авторизоваться, используя свой пароль.

Список доступа пользователей

Сначала создадим список доступа, используемый сервером vsFTPd. Обычно вы можете задать его в директории /etc/. Создайте файл с произвольным именем и перечислите в нем всех пользователей, которым вы хотите разрешить или запретить доступ. Например, давайте создадим новый список с единственным пользователем "root":
echo root > /etc/vsftpd.userlist

Далее, определим новый список пользователей в конфиграционном файле /etc/vsftpd.conf и активируем директиву userlist_enable:
userlist_file=/etc/vsftpd.userlist
userlist_enable=YES

Таким образом всем пользователям, перечисленным в файле /etc/vsftpd.userlist, будет отказано в доступе к FTP-серверу.
$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.3.5)
Name (localhost:root): lubos
530 Permission denied.
Login failed.
ftp>

Чтобы разрешить доступ всем пользователям, перечисленным в файле /etc/vsftpd.userlist, установите значение "NO" для директивы userlist_deny. При этом вы открываете доступ только пользователям, перечисленным в /etc/vsftpd.userlist. Каждое имя пользователя в этом файле должно располагаться на отдельной строке.

5.2 Другие настройки


На сегодняшний день vsFTPd имеет 125 опций конфигурации. Это делает его очень гибким в настройке и в то же время простым в использовании и администрировании. Хотите ли вы использовать его дома, в пределах корпоративной сети, или на удаленном сервере, вы можете быть уверены, что vsFTPd полностью удовлетворит ваши нужды.
Список настроек можно посмотреть тут:
http://www.lissyara.su/doc/man/vsftpd/
Список команд можно посмотреть тут:
http://www.nsftools.com/tips/RawFTP.htm