+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


В ранее опубликованной заметке «Часто задаваемые вопросы по работе с виртуальной машиной «Битрикс» мы отметили, что по умолчанию файлы на виртуальной машине «Битрикс» доступны только по SFTP и SSH. FTP-доступ считается разработчиками менее безопасным и его настройка требует дополнительных действий. Каких именно, мы сейчас расскажем.

1. Настроим SSH

Настроим SSH для доступа по SFT. Для этого найдем скрипт sshd_config по адресу

kdir /etc/backup cp /etc/ssh/sshd_config /etc/backup/sshd_config_default vi /etc/ssh/sshd_config

Поставим комментарий на строку

Subsystem sftp /usr/libexec/openssh/sftp-server

И добавим в конец скрипта код

# override default of no subsystems
Subsystem    sftp    internal-sftp
Match Group bitrix-ftp
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
ForceCommand internal-sftp
ChrootDirectory /srv/ftp/%u

После чего перезагрузим SSH командой

service sshd restart

2. Создадим скрипт для монтирования и размонтирования папок сайтов в виртуальном chroot окружении пользователя.

Создадим скрипт mount-ftp-sites по адресу /etc/init.d/mount-ftp-sites командой

# automounting ftp structure
touch /etc/init.d/mount-ftp-sites
chmod +x /etc/init.d/mount-ftp-sites
vi /etc/init.d/mount-ftp-sites

Введем в скрипт mount-ftp-sites код

#! /bin/sh
#
### BEGIN INIT INFO
# Provides:          mount-ftp-sites
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the ftp access to web sites
# Description:       Makes available separate access to web-sites
#                    with own ftp account.
### END INIT INFO
#
# Testing, if ftp database exists
if [ ! -f '/home/bitrix/ftpdb.db' ]; then
# Creating sqlite3 database of ftp accounts
sqlite3 /home/bitrix/ftpdb.db  "create table ftp (id INTEGER PRIMARY KEY,sitename TEXT,sitedir TEXT, ftpuser TEXT, ftppass TEXT);"
chown bitrix:bitrix /home/bitrix/ftpdb.db
echo "Database created"  
fi
start() {
echo "Starting mount web-site:"
data=$(sqlite3 /home/bitrix/ftpdb.db  "select sitename,sitedir from ftp;"
# for each site trying to mount FS
for site in $data  ; do
# Split selec results
array=(${site//|/ })
echo " Mounting /srv/ftp/${array[0]}/${array[1]}"
mount --bind "/home/bitrix/ext_www/${array[1]}" "/srv/ftp/${array[0]}/${array[1]}"
done
}
stop() {
echo "Starting umounting web-sites"
data=$(sqlite3 /home/bitrix/ftpdb.db  "select sitename,sitedir from ftp;"
# for each site trying to mount FS
for site in $data  ; do
# Split selec results
array=(${site//|/ })
echo " Umounting /srv/ftp/${array[0]}/${array[1]}"
umount "/srv/ftp/${array[0]}/${array[1]}"
done
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac
exit $?

Проверим работу скрипта mount-ftp-sites. Результат должен иметь вид:

[root@nejtr0n ~]# /etc/init.d/mount-ftp-sites stop
Database created
Starting umounting web-sites

3. Скрипт автоматического создания пользователей FTP-доступа

Создадим скрипт add_ftp_account.sh  по адресу /root/bitrix-env/add_ftp_account.sh

touch /root/bitrix-env/add_ftp_account.sh
chmod +x /root/bitrix-env/add_ftp_account.sh
vi /root/bitrix-env/add_ftp_account.sh

Введем в него следующий код:

#!/bin/bash
# Checking for root access
if [ `id -un` != root ]; then
echo 'This script must be run as root' 2>&1
exit 1
fi
# Check, if user exists
endRemoteUser="N"
remoteUser=${sitename};
while [ "$endRemoteUser" = "N" ]
do
cut -d: -f1 < /etc/passwd | grep -qin ^${remoteUser}$
if [ $? -eq 0 ]; then
#if user founded, making new username
echo "This user already exists! Please choose another name except ${remoteUser}"
read -p "User name for ftp access only for this site: " remoteUser
else
if [ $(echo ${remoteUser} | wc -c) -gt 31 ]; then
echo "Length of ${remoteUser} bigger than 32. Pleas make it shorter!"
read -p "User name for ftp access only for this site: " remoteUser        
else
endRemoteUser="Y"
fi
fi
done
# Check and create ftp user group
cut -d: -f1 < /etc/group | grep -qin ^bitrix-ftp$
if [ ! $? -eq 0 ]; then
groupadd bitrix-ftp
echo "Ftp group created"
fi

echo "Adding new user : ${remoteUser}"
useradd -M -K MAIL_DIR=/dev/null -g bitrix -G bitrix-ftp -s /bin/false ${remoteUser}
userPass=$(cat /dev/urandom | tr -cd 'a-fA-Z0-9' | head -c 12)
echo -e "$userPass\n$userPass\n" | sudo passwd ${remoteUser}

# filesystem to chroot
if [ ! -d /srv/ftp/${remoteUser}/${sitedir} ]; then
# Creating chroot
mkdir -p /srv/ftp/${remoteUser}/${sitedir}
fi
# Stop currently mounted sites
/etc/init.d/mount-ftp-sites stop
# adding currnet user to databae
sqlite3 /home/bitrix/ftpdb.db  "insert into ftp (sitename,sitedir,ftpuser,ftppass) values ('${sitename}','${sitedir}','${remoteUser}','${userPass}');"
# Start currently mounted sites
/etc/init.d/mount-ftp-sites start

# End message
echo "#############################"
echo "######### Auth info #########"
echo 'FTP user created:'
echo "Name: ${remoteUser}"
echo "Pass: ${userPass}"
echo "#############################"
echo "### Please save this data ###"

4. Скрипт автоматического удаления пользователей FTP-доступа

Создадим скрипт del_ftp_account.sh по адресу /root/bitrix-env/del_ftp_account.sh

touch /root/bitrix-env/del_ftp_account.sh
chmod +x /root/bitrix-env/del_ftp_account.sh
vi /root/bitrix-env/del_ftp_account.sh

Введем в него код:

#!/bin/bash
# Checking for root access
if [ `id -un` != root ]; then
echo 'This script must be run as root' 2>&1
exit 1
fi
# select current delted site

data=$(sqlite3 /home/bitrix/ftpdb.db  "select sitedir,sitename,ftpuser from ftp where sitedir='${arSite[$siteNum]}';"
array=(${data//|/ })
if [[ $data && ${data-x} ]] ; then
# Stopping all ftp access
/etc/init.d/mount-ftp-sites stop
# Deleting ftp chroot dir
if [ -d "/srv/ftp/${array[2]}" ] ; then
rm -rf /srv/ftp/${array[2]}
echo "Romoved /srv/ftp/${array[2]}"
fi
# Deleting user
userdel ${array[2]}
# Delete entry point from DB
sqlite3 /home/bitrix/ftpdb.db  "delete from ftp where sitedir='${arSite[$siteNum]}';"
# Start ftp access for another existing sites
/etc/init.d/mount-ftp-sites start  
else
echo "This site doesnt exist in ftp account database"
fi

5. Подключаем созданные скрипты как стандартные

Найдем файл add_site.sh по адресу /root/bitrix-env/add_site.sh

Отыщем в нем фрагмент кода

 echo
echo "The website has been created successfully."
read -p "Press any key" key

и перед ним добавим свой код

# My own deal
source "/root/bitrix-env/add_ftp_account.sh"

Затем найдем скрипт по адресу del_site.sh по адресу /root/bitrix-env/del_site.sh

Выберем в нем фрагмент кода

echo
echo "The configuration of website has been deleted successfully."
read -p "Press any key" key

и перед ним добавим свой код

# My own deal
source "/root/bitrix-env/del_ftp_account.sh"

6. Создаем дополнительный сайт

Для создания дополнительного сайта используем команду

~/menu.sh 
13

А результат должен быть такой:

..............................................................................
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
Ftp group created
Adding new user : p4k
Creating mailbox file: Not a directory
Changing password for user p4k.
New password: Retype new password: passwd: all authentication tokens updated successfully.
Starting umounting web-sites
Starting mount web-site:
Mounting /srv/ftp/p4k/testsite.secretdomain.ru
#############################
######### Auth info #########
FTP user created:
Name: p4k
Pass: UNdIN8JY1JDY
#############################
### Please save this data ###

The website has been created successfully.
Press any key

FTP-доступ настроен. Чтобы он создавался заново после перезагрузки, необходимо

7. Настроить автозагрузку монтирования FTP chroot окружения

Выполним для этого команду

sudo /sbin/chkconfig  mount-ftp-sites on

Теперь после каждой перезагрузки FTP-доступ будет создаваться заново, пока вы не удалите дополнительный сервер.

------------------------------------------
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA