Установка сервера для доступа поддержки

Материал из ISPWiki
Перейти к: навигация, поиск

Настройка login-server`а


Сервер для авторизации поддержки желательно установить на отдельном сервере для обеспечения безопасности.

Есть 2 части. Одна для доступа в панель управления. Вторая для доступа к ssh.

Также можно, вместо использования наших скриптов, написать свои, реализующие тот же функционал.

Установка рекомендуется на Debian 8 Jessie. На других процедура установки и запуска будет отличаться.

Сервер рекомендуется закрыть файрволлом от всех входящих соединение, не из той сети, откуда будет необходим доступ.


  • Создаём пользователя. Назовём его goserver
adduser --disabled-password --gecos "" goserver

Небольшая ремарка. Для работы достаточного одного пользователя как для web доступа, так и для ssh.

Но с точки зрения безопасности, пользователей лучше разделить.

Поэтому, ключ и web сервер будут у одного пользователя, а для ssh доступа будет другой пользователь, используя sudo.

Вместо разделения пользователей, также можно использовать SELINUX, но его настройка сложна.


  • Скачаем скрипты в директорию этого пользователя.

Скрипты находятся в репозитории на сервере github: https://github.com/ispsystem/login-server

Можно либо скачать их через git, либо скачать zip архив и развернуть.


  • Ставим git
apt-get update && apt-get -y install git

Скачиваем репозиторий:

git clone https://github.com/ispsystem/login-server /home/goserver/login-server


  • Ставим пакеты, необходимые для запуска web части скриптов.
apt-get -y install python-yaml python-paramiko gunicorn python-virtualenv gcc python-dev

gcc и python-dev необходимы для установки через pip модуля gevent. Имеющаяся в репозитории debian версия(1.0.1) не подходит из-за проблем с ssl (подробнее тут: https://github.com/gevent/gevent/issues/477 )


  • Создадим virtualenv окружение, чтобы установленные через pip модули не захламляли ОС.
virtualenv /home/goserver/venv


  • Установим в этом окружении нужные пакеты.
/home/goserver/venv/bin/pip install gevent ipaddress


  • Сгенерируем сертификаты для web-сервера
openssl req -newkey rsa:1024 -nodes -keyout /home/goserver/server.key -out /home/goserver/server.crt -x509 -days 3650 -subj \
"/C=XX/ST=XX/L=XX/O=XX/OU=XX/CN=example.com/emailAddress="root@example.com
chown goserver:goserver /home/goserver/server.key /home/goserver/server.crt


  • Создаём конфиг для gunicorn.
cat > /etc/gunicorn.d/goserver << EOF
CONFIG = {
    'working_dir': '/home/goserver/login-server',
    'user': 'goserver',
    'group': 'goserver',
    'environment': {
        'PYTHONPATH': '/home/goserver/venv/lib/python2.7/site-packages',
    },
    'args': (
        '--bind', '__IP_АДРЕС_СЕРВЕРА__:8443',
        '--workers', '1',
        '--timeout', '60',
        '--reload',
        '--certfile', '/home/goserver/server.crt',
        '--keyfile', '/home/goserver/server.key',
        '--do-handshake-on-connect',
        '--ssl-version', '5',
        '--ciphers', 'TLSv1.2,TLSv1',
        '-k', 'gevent',
        'goserver:myapp',
    ),
}
EOF


  • Генерируем ssh ключ без passphrase.
su -l goserver -c 'ssh-keygen -t dsa'

Публичную часть этого ключа (/home/goserver/.ssh/id_dsa.pub) нужно указать в BILLmanager, как ключ поддержки.


  • Создаём конфиг самого приложения.

Создаём /home/goserver/login-server/config.yml

Это yaml файл. Ниже пример конфига с комментариями.

# путь до приватного ssh ключа. Если он стандартный, можно не указывать.
keyfile: /home/goserver/.ssh/id_dsa

# Сети, с которых разрешён доступ. Формат обязательно сеть/маска
networks:
    - 192.168.0.0/24

# Пользователи, в формате логин: пароль, зашифрованный функцией crypt
# Пароль можно зашифровать так:
# mkpasswd -m md5 -S `pwgen -s 8 1` __ПАРОЛЬ__
users:
    user1: $1$J5hIelk6$JcTj78g3r7ddKW7ZX7j2x1
    user2: $1$gGJvd0dz$BoCItoXBq6EqdTg1m4G6D1

# Лог, в который будут записываться переходы. Пользователь goserver должен иметь права на запись в директоию(чтобы создать файл), либо файл должен быть создан заранее.
logfile: /var/log/goserver.log


  • Создаём логфайл
touch /var/log/goserver.log
chown goserver /var/log/goserver.log


  • Запускаем gunicorn, и добавляем его в автозапуск.
systemctl stop gunicorn # на тот, случай, если он уже был запущен.
systemctl enable gunicorn
systemctl start gunicorn


  • Создаём второго пользователя, для ssh доступа. Назовём его support
adduser --disabled-password --gecos "" support


  • Устанавливаем скрипт go пользователя goserver в качестве логин шелла для пользователя support.
usermod -s /home/goserver/login-server/go support


  • Устанавливаем sudo
apt-get -y install sudo


  • Разрешаем пользователю support запускать ssh.

Разрешаем пользователю support без пароля запускать с правами пользователя goserver одну команду: /usr/bin/ssh

Для этого в /etc/sudoers дописываем строку (лучше это делать, используя команду visudo)

support ALL=(goserver) NOPASSWD: /usr/bin/ssh


  • Настраиваем скрипт go

Создаём файл /home/goserver/login-server/config.sh

cat > /home/goserver/login-server/config.sh << EOF
log=/var/log/gossh.log  # путь до лога входов. Пользователь support должен иметь права на запись в директорию, либо файл должен быть создан заранее.
logdir=/var/log/gossh  # путь до директории с логами stdout соединений. Пользователь support должен иметь права на запись в директорию.
#keyfile=path_to_file  # путь до приватного ssh ключа. Если он стандартный, можно не указывать
sudouser=goserver  # пользователь, в которого делать sudo
EOF


  • Создаём файлы/директории для логов
touch /var/log/gossh.log
chown support /var/log/gossh.log
mkdir -p /var/log/gossh
chown support /var/log/gossh


  • Настраиваем ротацию логов

Ставим logrotate

apt-get -y install logrotate

Создаём настройки для logrotate

cat > /etc/logrotate.d/goserver << EOF
/var/log/gossh/*.log {
        size 1M
        copytruncate
        delaycompress
        compress
}
/var/log/gossh.log {
        size 1M
        copytruncate
        delaycompress
        compress
}
 
/var/log/goserver.log {
        size 1M
        delaycompress
        compress
        postrotate
                systemctl reload gunicorn
        endscript
 
EOF


  • Использование.

Пары логин:пароль добавлять в /home/goserver/login-server/config.yml в раздел users

После этого надо попросить web-сервер перечитать конфиг.

systemctl reload gunicorn

Для ssh публичую часть ssh ключа сотрудника надо добавлять в /home/support/.ssh/authorized_keys

Для ssh доступа сотрудники поддержки буду исползовать такую команду

ssh -t support@__IP_АДРЕС_СЕРВЕРА__ go __IP_АДРЕС_КУДА_ПОДКЛЮЧАТЬСЯ__

Можно выполнить одну команду

ssh -t support@__IP_АДРЕС_СЕРВЕРА__ go __IP_АДРЕС_КУДА_ПОДКЛЮЧАТЬСЯ__ ps uxaw

Можно копировать файлы через rsync

rsync -aPv /tmp/srv/ -e "ssh -t support@__IP_АДРЕС_СЕРВЕРА__ go" __IP_АДРЕС_КУДА_ПОДКЛЮЧАТЬСЯ__:/tmp/