Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
то ждем ваше обращение в нашей службе тех поддержки.
В ранее опубликованной заметке «Часто задаваемые вопросы по работе с виртуальной машиной «Битрикс» мы отметили, что по умолчанию файлы на виртуальной машине «Битрикс» доступны только по 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-доступ будет создаваться заново, пока вы не удалите дополнительный сервер.
------------------------------------------
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!
Назад в раздел
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-доступ будет создаваться заново, пока вы не удалите дополнительный сервер.
------------------------------------------
Спасибо за внимание!
Читайте свежий выпуск «Кладовки программиста» каждый день!
Назад в раздел
Подписаться на новые материалы раздела: