20150129

Связка chroot и sftp

Связку chroot + sftp применяют когда необходимо запереть пользователя в определенной папке.  Как правило такие задачи возникают на серверах с хостингом.

Задача - предоставить пользователям user1 и user2 доступ по sftp к каталогам в которых лежат их сайты и запереть их там. Пользователю user3 предоставить доступ к произвольному каталогу.

1. Определяем место где будут лежать сайты пользователей, создаем необходимые папки.

# mkdir -p /var/www/user1/mysite
# mkdir -p /var/www/user2/mysite
# mkdir -p /mnt/sdc1/project

user1 и user2 не должны подниматься выше /var/www/user1 и /var/www/user2 соответственно. user3 не должен подниматься выше /mnt/sdc1/project.

2. Создаем группу sftp_only (скорее всего она уже есть) для пользователей user1 и user2.
Создаем группу sftp_user3 для пользователя user3.

# groupadd sftp_only
# groupadd sftp_user3

3. Создаем пользователя, задаем ему домашнюю директорию, шелл и добавляем его в группу.

# useradd -d /var/www/user1/mysite -s /sbin/nologin -G sftp_only user1
# useradd -d /var/www/user2/mysite -s /sbin/nologin -G sftp_only user2
# useradd -d /mnt/sdc1/project -s /sbin/nologin -G sftp_user3 user3

Командой passwd задаем пользователям пароли.
В файлах /etc/group и /etc/passwd проверяем, что пользователи создались правильно.

4. Вносим изменения в конфигурацию sshd (файл /etc/ssh/sshd_config).

Коментируем строчку
#Subsystem      sftp    /usr/libexec/openssh/sftp-server

И под ней добавляем новую строчку
Subsystem       sftp    internal-sftp

Определяем пользователей и ip адреса с которых на сервер можно зайти по ssh.
AllowUsers root@1.1.1.1 user1@2.2.2.2,3.3.3.3 user2@4.4.4.*,4.4.5.0/24 user3

##AllowUsers root - очень и очень..  нет, просто супертурбо очень плохо=)

В конец файла добавляем для группы sftp_only

Match Group sftp_only
    ChrootDirectory /var/www/%u
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

И для группы sftp_user3

Match Group sftp_only
    ChrootDirectory /mnt/sdc1/project
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

Сохраняем файл и перезапускаем sshd.

5. Выставляем права на папки. 

Папки /var/www/user1, /var/www/user2 и  /var/www/user2 и /mnt/sdc1/project должны принадлежать пользователю и группе root. 
Папка /var/www/user1/mysite должна принадлежать пользователю и группе user1, а /var/www/user2/mysite должна принадлежать user2. 

После этого все должно работать.

---

При написании заметки использовались материалы:
http://kb.skullboxx.net//?q=node/546

Ошибка Mysql - ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist

На Cenos 5 работает mysql-5.1.58. При попытке дать команду "flush privileges" вылезала следующая ошибка:

mysql> flush privileges;
ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist

В базе "mysql" не было таблицы "servers".

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| func                      |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| proc                      |
| procs_priv                |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
17 rows in set (0.01 sec)

На других серверах с более поздней версией таблица "servers" была.
Для решения проблемы надо создать требуемую таблицу. 

mysql> CREATE TABLE `servers` ( `Server_name` char(64) NOT NULL, 
`Host` char(64) NOT NULL, 
`Db` char(64) NOT NULL, 
`Username` char(64) NOT NULL, 
`Password` char(64) NOT NULL, 
`Port` int(4) DEFAULT NULL, 
`Socket` char(64) DEFAULT NULL, 
`Wrapper` char(64) NOT NULL, 
`Owner` char(64) NOT NULL, 
PRIMARY KEY (`Server_name`) ) 
ENGINE=MyISAM 
DEFAULT CHARSET=utf8
COMMENT='MySQL Foreign Servers table';

Query OK, 0 rows affected (0.02 sec)

##В последней строчке должны стоять одинарные кавычки, а не апостроф как выше.  

После добавления таблицы все стало хорошо.
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

--- 

При написании заметки использовались материалы:
http://linux-lab.ru/oshibka-error-1146-42s02-table-mysql-servers-doesnt-exist/
https://rajesh9333.wordpress.com/2012/08/25/flush-privileges-error-in-mysql/