Отключение прослушивания IPv6 адресов
По умолчанию sshd(8) слушает как на IPv4 так и на IPv6 адресах. Для того что бы отключить возможность работы по IPv6, необходимо изменить параметр AddressFamily:
Код: Выделить всё
AddressFamily inetПо умолчанию sshd(8) принимает подключения на всех интерфейсах, в чем не всегда есть необходимость. Если не требуется заходить на сервер “из вне”, следует ограничить его работу определенным адресом с помощью параметра
Код: Выделить всё
ListenAddress:
# ListenAddress 0.0.0.0
ListenAddress 192.168.1.2Ограничение доступа суперпользователя
В большинстве дистрибутивов в целях безопасности доступ суперпользователю по SSH закрыт (PermitRootLogin no), и при попытке зарегистрироваться под root получаем сообщение об ошибке. Для выполнения задач, требующих привилегий администратора, приходится заходить под обычным пользователем и использовать su(1) или sudo(8). Красиво выйти из ситуации поможет директива Match. В качестве аргумента ей передается критерий отбора (User, Group, Host, Address), его значение и параметр, который нужно применить. Для примера разрешим подключение под root только с localhost и из доверенной подсети 192.168.5.0/24:
PermitRootLogin no
Match Host 192.168.5.*,127.0.0.1
PermitRootLogin yes
Контроль неудачных подключений
Следующие две директивы позволяют контролировать неудачные подключения к серверу:
Код: Выделить всё
LoginGraceTime 60
MaxStartups 2:50:10Контроль за подключениями пользователей
Установки в файлах /etc/ssh/sshrc или ~/.ssh/rc позволяют выполнить некоторые действия при регистрации пользователя. Здесь можно использовать любые команды оболочки. Например, отправим администратору на почту уведомление о том, что в систему по SSH зашел пользователь:
Код: Выделить всё
# vi /etc/ssh/sshrc
echo $(date) $SSH_CONNECTION $USER $SSH_TTY | mail -s “ssh login” admin@domain.ruГенерируем пару ключей (секретный и публичный):
Код: Выделить всё
#ssh-keygen -t rsa -C ‘remote backup’
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
/home/user/.ssh/id_rsa_backupКод: Выделить всё
$ ssh remotehost “umask 077; cat > .ssh/authorized_keys” < .ssh/id_rsa_backup.pub
Код: Выделить всё
$ ssh -t remotehost vi .ssh/authorized_keys
from=”192.168.0.*,212.34.XX.YY”,command=”cd /work; tar cvf - ./* | bzip2 -9″,
no-pty,no-agent-forwarding,no-X11-forwarding,no-port-forwarding ssh-rsa AAAA[…]
Код: Выделить всё
$ ssh -i .ssh/id_rsa_backup remotehost > ~/backup/work-`date +%d%m%Y`.tar.bz2 2>/dev/nullИспользуем dump в связке с SSH
Используя SSH, можно защитить информацию, передаваемую программами, не имеющими встроенных механизмов шифрования соединения. Например, сделаем бэкап с помощью dump(8) на удаленный сервер:
Код: Выделить всё
$ sudo dump -0au -f - /dev/rwd1a | gzip -9 | ssh remotehost ‘dd of=cvs_backup.dump.gz’Код: Выделить всё
$ ssh remotehost touch /home/user/cvs.dump
$ env RSH=`which ssh` sudo -E dump 0f remotehost:/home/user/cvs.dump /cvsПередать файл, используя SSH, можно одним из следующих способов:
Код: Выделить всё
$ cat myfile | ssh remotehost ‘cat > myfile’
$ tar zcf - ~/coding | ssh remotehost ‘cat > coding.tgz’Код: Выделить всё
$ scp -r mydir user@host.domain.ru:Код: Выделить всё
$ tar cf - source | ssh remotehost “(cd /target; tar xpf -)”Код: Выделить всё
$ ssh remotehost “tar cf - source” | (cd /target; tar xpf -)Для безопасного получения почты с помощью fetchmail можно использовать SSH. Для этого в конфигурационном файле ~/.fetchmailrc необходимо указать следующее:
Код: Выделить всё
poll localhost with protocol pop3 and port 8110:
        preconnect "ssh -f -q -C user@213.167.XX.YY \
 -L 8110:213.167.XX.YY:110 sleep 10" password noIdea;
Код: Выделить всё
$ fetchmail
1 message for user at localhost (8062 octets).
reading message user@localhost.domain.ru:1 of 1 (8062 octets)……. flushedНастроим 192.168.1.1 на перенаправление входящей и исходящей почты по шифрованному каналу для клиентов из 192.168.1.0/24 на mail.domain.ru:
Код: Выделить всё
$ vi .ssh/config
Host mail
 Hostname mail.domain.ru
 LocalForward 192.168.1.1:8025 mail.domain.ru:25
 LocalForward 192.168.1.1:8110 mail.domain.ru:110
 LocalForward 192.168.1.1:8143 mail.domain.ru:143
 GatewayPorts yes
Код: Выделить всё
$ ssh mailПараметр ProxyCommand позволяет выполнить произвольную команду. Для примера подключимся через шлюз к файловому серверу, который находится за NAT:
Код: Выделить всё
$ vi .ssh/config
Host gateway
        HostName ns.domain.ru
Host filesrv
        HostName 192.168.5.201
        ProxyCommand ssh gateway nc -w 180 %h %pКод: Выделить всё
$ ssh filesrvИспользование параметра ControlMaster позволяет ускорить доступ к удаленному серверу за счет того, что в специальном файле сохраняются все параметры предыдущего сеанса, которые и используются при повторном подключении. Для примера создадим две Host-секции:
Код: Выделить всё
$ vi .ssh/config
Host srv1
 HostName 213.167.XX.YY
 ControlMaster yes
 # Здесь %r - имя, %h - хост и %p - порт
 ControlPath ~/.ssh/ctl-%r-%h-%p
Host srv1fast
 HostName 213.167.XX.YY
 ControlMaster no
 ControlPath ~/.ssh/ctl-%r-%h-%pКод: Выделить всё
ttyp0$ time ssh srv1 uptime
 5:55PM  up 37 days,  9:19, 1 user, load averages: 0.33, 0.32, 0.33
    0m0.77s real     0m0.06s user     0m0.01s systemttyp0$ ssh srv1
ttyp1$ time ssh srv1fast uptime
 5:57PM  up 37 days,  9:20, 2 users, load averages: 0.37, 0.34, 0.33
    0m0.03s real     0m0.00s user     0m0.01s system
Код: Выделить всё
Создание SOCKS-сервераКод: Выделить всё
$ ssh -D1080 user@domain.ruКод: Выделить всё
$ vi .ssh/config
Host proxy
        HostName ns.domain.ru
        DynamicForward 1080
Код: Выделить всё
ssh proxyКод: Выделить всё
$ echo -n “GET / HTTP/1.0\r\n\r\n” | nc -X 5 -x 127.0.0.1:1080 \
 www.domain.ru 80 | head -4
HTTP/1.1 200 OK
Date: Sat, 23 Feb 2008 14:27:43 GMT
Server: Apache
X-Powered-By: PHP/4.4.1Код: Выделить всё
$ tsocks thunderbirdВ OpenSSH 4.9 появилась долгожданная поддержка chroot(2) для sshd(8), контролируемая с помощью опции ChrootDirectory. К примеру, заставим подключающегося по sftp пользователя worker переходить в измененный корневой каталог data:
Код: Выделить всё
# vi /etc/ssh/sshd_config
#Subsystem  sftp   /usr/libexec/sftp-server
Subsystem   sftp   internal-sftpMatch User worker
 X11Forwarding no
 AllowTcpForwarding no
 ForceCommand internal-sftp
 ChrootDirectory /data
Код: Выделить всё
# vi /etc/ssh/sshd_config
#Subsystem  sftp   /usr/libexec/sftp-server
Subsystem sftp internal-sftpMatch Group wwwusers
 X11Forwarding no
 AllowTcpForwarding no
 ForceCommand internal-sftp
 ChrootDirectory /var/www/hosting/%uСкрываем записи о серверах, к которым мы подключались
Некоторые администраторы, возможно, захотят зашифровать все IP и доменные адреса из файла .ssh/known_hosts. Делается это следующим образом:
Код: Выделить всё
$ echo ‘HashKnownHosts’ >> ~/.ssh/config
$ ssh-keygen -H -f ~/.ssh/known_hosts
$ head -1 ~/.ssh/known_hosts
+|1|TJ2SaXGqO8uHYeiA92KuNRIKR7M=|GpQB8Qz0tQPqA+nF+ghe37mpcHA= ssh-rsa AAAA[…]Управляющие последовательности SSH станут доступны, если в SSH-сессии сначала нажать <Enter>, затем управляющий символ сеанса (по умолчанию тильда, задается директивой EscapeChar) и специальную клавишу, которая указывает, какую именно функцию следует выполнить.
Допустим, мы с mail.domain.ru зашли на bastion.domain2.ru и решили, что не плохо было бы открыть обратный шифрованный туннель к почтовому серверу для безопасной загрузки сообщений. С помощью комбинации клавиш “<Enter>~C” можно интерактивно управлять локальным и удаленным форвардингами (ключи ‘-L’ и ‘-R’):
- bastion$ <Enter>~C
ssh> -R 8110:mail.domain.ru:110
Forwarding port. 
Код: Выделить всё
bastion$ telnet localhost 8110
+OK Dovecot ready.
Кстати, обратившись к подсказке, получим список всех доступных ключей и дополнительных параметров:
Код: Выделить всё
bastion$ <Enter>~C
ssh> help
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -KR[bind_address:]port                 Cancel remote forward
Код: Выделить всё
ns$ ssh mx
mx$ <Enter>~C
ssh> !uptime # команда выполняется на хосте ns
 7:02PM  up 100 days, 11 mins, 1 user, load averages: 0.13, 0.21, 0.23
<Enter>
mx$ uptime  # команда выполняется на хосте mx
 7:02PM  up 4 days,  7:34, 1 user, load averages: 0.21, 0.23, 0.19Код: Выделить всё
mx$ <Enter>~<Ctrl-Z>
[1] + Suspended            “ssh” “$@”Список текущих SSH-соединений можно просмотреть комбинацией:
Код: Выделить всё
mx$ <Enter>~#
The following connections are open:
  #0 client-session (t4 r0 i0/0 o0/0 fd 5/6 cfd -1)Код: Выделить всё
mx$ <Enter>~.
Connection to 213.167.XX.YY closed.Чтобы в консоли не вводить полное доменное имя, порт и учетную запись для подключения к удаленной системе, стоит заручиться поддержкой директивы Host:
Код: Выделить всё
$ vi ~/.ssh/config
Host mx
 Hostname mx.domain.ru
 Port 2022
 User admin
Код: Выделить всё
ssh mxПолучение доступа к закрытому сервису
Многие администраторы в целях безопасности скрывают свои сервера в демилитаризованной зоне, либо за NAT’ом, и разрешают входящие соединения только с доверенных IP-адресов и по определенными портам. Поэтому доступ ко многим полезным ресурсам получить напрямую нельзя. Это как раз тот случай, когда использование SSH-форвардинга может исправить ситуацию.
Код: Выделить всё
$ vi ~/.ssh/config
Host gate
        Hostname gate.domain.ru
# Для ускорения соединений включаем мультиплексирование SSH-сессий
        ControlMaster auto
        ControlPath ~/.ssh/ctl-%r-%h-%p
# Перенаправляем локальный порт на файловый сервер (Win2k3 с поднятым VShell)
        LocalForward 8022 192.168.1.101:22# Подключаясь к localhost:8022, мы будем попадать на файловый сервер
Host fileserver
        Hostname localhost
        Port 8022
        ControlMaster auto
        ControlPath ~/.ssh/ctl-%r-%h-%p
        HostKeyAlias fileserver
Код: Выделить всё
$ ssh -N -f gate
$ telnet localhost 8022
SSH-2.0-VShell_3_0_4_656 VShell
Код: Выделить всё
$ ssh fileserver
Microsoft Windows [Version 5.2.3790]
C:\Documents and Settings\Username\My Documents>Сервис SSH является любимой мишенью злоумышленников, поэтому следует принять некоторые меры безопасности. Одна из них - ограничение количества подключений, чтобы избежать DoS-атаки и перебора паролей.
Код: Выделить всё
# vi /etc/pf.conf
table <sshbf> persist
block in log quick on $ext_if inet from <sshbf>
pass in log on $ext_if inet proto tcp to $ext_if port ssh keep state \
 (max-src-conn-rate 5/60, overload <sshbf> flush global)Перенаправление X11-подключений
Для перенаправления X11-подключений следует использовать ключ ‘-Y’:
Код: Выделить всё
$ ssh -Y user@domain.comИсточник

