SSH хитрости

Материал из rrv-wiki
Перейти к навигации Перейти к поиску


Полностью взято здесь, сохранено на всякий случай ниже

SSH

Описание ssh c англоязычной Wikipedia (перевод):

В компьютерных сетях ssh или " Secure Shell" является сетевым протоколом с позволяющим устанавливать связь между локальным и удаленным (remote) компьютерами. При этом применяется криптография с публичным ключом (public key), для аутентификации удаленного компьютера или, опционально, для позволения аутентифицировать пользователя с удаленного компьютера. ssh гарантирует конфиденциальность и целостность передачи данных между обоими компьютерами, используя кодирование и MACs (message authentication codes). Типичнная сфера применения ssh - вход в систему на удаленном (remote) компьютере и выполнение команд на нем, также поддерживается туннелирование и форвардинг любых портов TCP и X11. Файлы могут передаваться по включенным в ssh протоколам sftp или scp. В базовой установке сервер ssh использует порт TCP 22.


Немецкоязычную первичную информацию о ssh можно найти на страницах немецкоязычной Wikipedia.

Безопастность протокола ssh

Как правило, регистрация root через ssh должна быть запрещена. Вообще стоит избегать входа в систему как root, что позволит получить дополнительные гарантии безопасности. Так же, с целью ограничить возможность проведения атак типа brute force (перебор паролей по словарю, требующий значительного времени), стоит ограничить пользователей как в количестве попыток для входа в систему, так в продолжительности открытия окна регистрации (до 10 минут)

Вышеуказанные меры возможно реализовать путем редактирования файла конфигурации ( в любом, предпочитаемом Вами редакторе):

/etc/ssh/sshd_config

Ищем и изменяем рискованные установки.

Следующие установки должны быть изменены:

Порт <желаемый порт>: эта запись должна указывать на порт в маршрутизаторe, который свободно соединен к линии. Если Вы не знаете, что это такое, стоит еще раз обдумать применение ssh для Remote управления. Debian устанавливает порт 22 как стандарт. Однако целесообразно, использовать порт вне зоны стандартного сканирования, поэтому мы используем, например, порт 5874:

Port 5874

ListenAddress <IP компьютера или интерфейса сети>: Так как порт передается дальше роутеру, компьютер должен использовать статический IP адрес, если только не используется никакой локальный DNS сервер. Мы используем статический IP для примера:

ListenAddress 192.168.2.134

Хотя версия 2 протокола ssh установлена в Debian по умолчанию, но, конечно, стоит удостовериться в этом еще раз.

LoginGraceTime <временной промежуток процесса регистрации>: позволенный для регистрации промежуток времени составляет как стандарт абсурдные 600 секунд. Так как 10 минут явно избыточны, чтобы ввести имя пользователя и пароль, мы установим  несколько более благоразумный промежуток времени:

LoginGraceTime 45

Теперь имеется 45 секунд для входа, и хакер не имеет 10 минут на каждую попытку взломать пароль.

PermitRootLogin <yes>: почему здесь Debian выдал разрешение на вход в систему как root, не объяснимо. Мы исправляем на 'no':

PermitRootLogin no
StrictModes yes

MaxAuthTries <количество позволенных попыток регистрации>: Вы не должны устанавливать больше чем 3 или 4:

MaxAuthTries 2

Следующие установки должны быть добавлены, так как они отсутствуют по умолчанию:

AllowUsers: имена пользователей, которым позволен доступ через ssh, разделенные символом пробела

AllowUsers <xxx>: только зарегистрированные пользователи могут использовать доступ, и только с пользовательскими правами. С adduser можно добавить пользователя специально для использования ssh:

AllowUsers werauchimmer

Так же можно ограничить с каких IP может заходить пользователь

AllowUsers user1@172.16.1.2?? user1@10.0.0.20 user1@192.168.3.* user2@* user3@172.16.1.* user3@192.168.3.* user3@10.0.0.20 user3@10.0.0.30

PermitEmptyPasswords <xxx>: дает Вашему пользователю прекрасный длинный пароль, который за миллионы лет нельзя было бы подобрать. Пользователь с доступом ssh должен быть единственным. Если он уже зарегистрирован, то может с su стать root:

PermitEmptyPasswords no

PasswordAuthentication <xxx>: конечно, должено иметь значение 'yes'. В случае, когда не используют KeyLogin.

PasswordAuthentication yes [если никаких keys не используют]

В конце концов:

/etc/init.d/ssh restart

Теперь имеется достаточно надежная конфигурация ssh. И напомним еще раз, что лучше, прежде всего добавить пользователя специально для использования ssh.

Программы X-Windows используемые через SSH

Сама программа исполняется на удаленном компьютере, графическая пользовательская оболочка (GUI) отображается на локальном компьютере.

Ввод данных:
* sidux
* IP локального компьютера: 192.168.1.10/24 (только выдача изображения X11 программы)
* IP локального компьютера: 192.168.1.2/24 (здесь выполняется X11 программa)

Конфигурация:

На удаленном компьютере дополняем файл /etc/hosts.allow следующими строками:

ssh sshd : 192.168.1.0/24 : ALLOW 
# e.g. позволяет (allow) всем адресам по локальной сети 
# (local area network, локальная сеть) доступ через ssh server

Откройте консоль и используйте следующую команду. (Это создаёт ssh соединение с X-Forwarding) :

ssh -X 192.168.1.2
(вводят собственный пароль ssh, если запрашивается, или пароль к ключу ssh, если на Remote компьютер послан собственный публичный ключ и там добавились файлы authorized_keys для указанного пользователя)

Вызов программы X в терминале:, например 'iceweasel':

ssh -X 192.168.1.2
(вводят (по запросу) собственный пароль ssh или пароль к ключу ssh, 
если на Remote компьютер послан собственный публичный ключ и там 
добавились файлы authorized_keys для указанного пользователя)
iceweasel oder oocalc oder oowriter oder kspread

Remote доступ с персонального компьютера в Windows при использовании ssh и X-Forwarding:

* Загружают и прожигают Cygwin XLiveCD
* Вставляют CD в дисковод и ждут автоматический старт (autorun)
* Далее (continue) нажимают до тех пор пока не откроется окно терминала.
* Вводят следующую команду:

ssh -X username@xxx.xxx.xxx.xxx

Помните: xxx.xxx.xxx.xxx является IP Linux Remote компьютера или его URL (например dyndns.org аккаунта), и пользовательское имя является, конечно, пользовательским именем существующего пользовательского аккаунта на Remote компьютере. После успешного начала сеанса можно, например, запустить 'kmail' для получения электронных сообщений.

Важно: hosts.allow должен содержать запись, которая также позволяет доступ компьютерам из других сетей. Если используется маршрутизатор или NAT-брандмауэр, то  порт 22 должен быть переданным дальше (portforwarding) на Linux-PC.

SSH в konqueror

Konqueror включает поддержку ssh в виде протоколов using sftp:// and uses the ssh protocol.

1) Open a new Konqueror window

2) Enter into the address bar: sftp://username@ssh-server.com


При­мер 1: Во всплывающем окне будет запрошен пароль ssh,  введите пароль и нажмите ОК:

sftp://sidux1@my-home-server.dyndns.org

Пример 2: непосредственное  соединение,  без запроса пароля

sftp://username:password@ssh-server.com

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

sftp://username@10.x.x.x or 198.x.x.x.x
(Примечание: введите пароль во всплывающем окне и нажимайте ОК)

SSH соединение таким образом оказывается установленным. В соответствующем окне Konqueror можно работать с файлами на сервере ssh также, как с локальными.

NOTE: If you have set the ssh port to to use another port, other than the default of 22, you need to specify the port that sftp/fish is to use:

sftp://user@ip:port

'user@ip:port' is standard sytax for many programs like sftp, smb, fish

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

SSHFS - это простой, быстрый и надежный метод использующий  FUSE, для подсоединения удаленной файловой системы. Со стороны сервера необходим только работающий ssh-daemon.

Со стороны клиента сперва инсталлируется sshfs:

apt-get update && apt-get install sshfs

Подсоединение удаленной файловой системы очень просто:

sshfs username@remote_hostname:directory local_mount_point

Причем username подразумевает имя пользователя на удаленном Host.

Если не указывается никакой определенный каталог, будет открыт каталог Home удаленного пользователя. Пожалуйста, обратите внимание: двоеточие : является непременно нужным, даже если никакой каталог не указывается!

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

Отсоединение:

fusermount -u local_mount_point

При регулярном использовании sshfs рекомендуется внести запись в /etc/fstab вида:

sshfs#username@remote_hostname:directory local_mount_point fuse user,noauto 0 0

Это делает возможным каждому пользователю группы fuse подсоединить файловую система известной командой:

mount /путь/к/mount/точка

Отсоединение можно произвести следующей командой:

umount /путь/кmount/точка

А этой командой проверяется, -  членство в группе fuse:

cat /etc/group | grep fuse

Ответ должен был выглядеть, например, таким образом:

fuse:x:117: <имя пользователя>

Если имя пользователей (username) не указано, используют,. как root, команду adduser:

adduser <имя пользователя> fuse

Внимание: "id" будет только после повторного регистрирования в группе "fuse".

Теперь имя пользователя должно быть указано, и следующие команды становятся выполнимы:

mount local_mount_point

и

umount local_mount_point
Содержание, последнее пересмотрено 19/11/2007 1300 UTC

TCPKeepAlive

Для поддержки ssh подключения используем опции:

  • ClientAliveInterval - время простоя в секундах, после которого служебный запрос. Поддерживается только протокол 2. По-умолчанию установлен в 0, т.е. не использовать служебные запросы
  • ClientAliveCountMax - количество проверок доступности клиента, которые могут оставаться без ответа. Если предел достигнут, sshd завершит сеанс:
ssh -o TCPKeepAlive=yes -o ServerAliveInterval=30 -o ServerAliveCountMax=10 $HOST

Обратный ssh туннель

Образец:

ssh server_user@server_ip -R [bind_address:]port:host:hostport

или с поддержкой туннеля:

ssh -o TCPKeepAlive=yes -o ServerAliveInterval=15 -o ServerAliveCountMax=10 server_user@server_ip -R [bind_address:]port:host:hostport

например

ssh rrv@192.168.0.1 -R 192.168.0.1:8888:localhost:9999

Расшарит на удаленном сервере на ip 192.168.0.1 и порту 8888 локальный порт 9999 (машины с которой инициируем ssh подключение)

Так вот, в обычном случае на удаленном сервере расшарится порт только на 127.0.0.1 не зависимо от того что мы укажем в bind_address. Для того что-бы все работало как мы хотим, на сервере к которому подключаемся в файле

/etc/ssh/sshd_config

необходимо добавить строку

GatewayPorts yes

и перезапустить sshd

sudo service ssh restart

Привилегированные порты (1-1024) могут быть использованы только для пользователя root.

Скрипт для запуска через cron:

#!/bin/bash

# Проверяем есть ли подключение по ssh
TUN=$(/usr/bin/ps -waux | grep i-rrv.ru | grep -v grep)
if [[ -z ${TUN} ]]
then
/usr/bin/ssh -N -o TCPKeepAlive=yes -o ServerAliveInterval=15 \
-o ServerAliveCountMax=10 -i /home/tunnel/.ssh/id_rsa i-rrv.ru ]
-p22 -R127.0.0.1:8888:127.0.0.1:9999 &
fi
exit 0
  • -N - только туннель, без возможности посылать команды

Проверка работы туннеля

Скрипт для проверки туннеля:

#!/bin/bash

NC='/bin/nc'
#NC='netcat'

HOST='192.168.0.1' # host Из предыдущего примера
PORT='8888'        # port Из предыдущего примера

DT=`/bin/date`

if ( ! $NC -w10 -z $HOST $PORT ) ; then # проверяем текущий порт и если он закрыт,
   echo "tunnel (port) НЕ доступен $DT"  >> /var/log/ssh_tunnel.log
   # ssh rrv@192.168.0.1 - тоже из предыдущего примера
   /bin/ps waux | /bin/grep -v grep | /bin/grep "ssh rrv@192.168.0.1" \
   | /usr/bin/awk '{system ("kill -9 "$2" && echo Процесс убит")}' >> /var/log/ssh_tunnel.log
   echo "" >> /var/log/ssh_tunnel.log
fi

Запуск скрипта добавляем в cron