====== Сервис SSH ======
* [[http://ru.wikipedia.org/wiki/SSH|SSH (wikipedia)]]
* [[https://habr.com/ru/articles/747080/|SSH с высоты птичьего полёта, или разгребаем кучи ключей]]
* [[https://www.serfish.com/console/|Web-based access to any SSH server]]
* [[http://linux.bolden.ru/ssh-tunnels/|Подробный анализ теории и практики использования SSH-туннелей]]
* [[https://m.habr.com/post/435546/|Практические советы, примеры и туннели SSH]]
===== Установка =====
==== Windows ====
=== PuTTY ===
* [[http://www.putty.org/|PuTTY]]
* [[https://the.earth.li/~sgtatham/putty/latest/w64/]]
* [[http://val.bmstu.ru/unix/SSH/putty-64bit-0.76-installer.msi]]
Terminal->Features->Disable application keypad mode
HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys
=== MobaXterm ===
* [[https://mobaxterm.mobatek.net/|MobaXterm]]
* [[https://bbs.archlinux.org/viewtopic.php?id=174595|Weird characters while pasting in terminal]]
printf "\e[?2004l"
=== WinSCP ===
* [[https://winscp.net/eng/docs/lang:ru|WinSCP]]
* [[http://val.bmstu.ru/unix/SSH/WinSCP-5.19.2-Setup.exe]]
==== Ubuntu/Debian ====
# apt install ssh
===== Настройка ssh сервера =====
gate# cat /etc/ssh/sshd_config.d/my.conf
Port 2222
DenyUsers "user*"
PermitRootLogin yes
#KexAlgorithms +diffie-hellman-group1-sha1,diffie-hellman-group-exchange-sha1
#HostkeyAlgorithms +ssh-dss,ssh-rsa
Проверка конфигурации
# /usr/sbin/sshd -t
Печать fingerprint публичного ключа
gate# ssh-keygen -l -f /etc/ssh/ssh_host_dsa_key.pub
===== Настройка ssh клиента =====
* [[Утилита corkscrew]]
$ sftp -P 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user3@localhost
$ mkdir .ssh/
$ cat ~/.ssh/config
Host *
ServerAliveInterval 10
#Host gitlab*
# Port 2222
## User root
#Host switch* 192.168.X.5*
# KexAlgorithms +diffie-hellman-group1-sha1
# Ciphers +aes128-cbc
# UserKnownHostsFile=/dev/null
# StrictHostKeyChecking=no
# LogLevel ERROR
### HostKeyAlgorithms +ssh-rsa
### PubkeyAcceptedKeyTypes +ssh-rsa
===== Варианты использования =====
==== SSH вместо Telnet ====
# ssh -l user1 gate
# ssh user1@gate
==== SSH вместо RSH ====
student@hostX$ ssh -l user1 gate "uname -a"
student@hostX$ cat /etc/hosts | ssh -l user1 gate "cat > hosts.bak"
student@hostX$ cd /; sudo tar -cf - etc/ | ssh -l user1 gate "cat > etc.tar"
server# ssh switch1 "show cdp neighbors"
==== SSH вместо RCP (SCP) ====
==== SCP ====
$ scp -P 2222 val@radio.specialist.ru:/usr/local/www/apache22/data/unix/virus.zip .
server# scp switchN:running-config /srv/tftp/switchN-running-config
deb12_ub24# scp -O switchN:running-config /srv/tftp/switchN-running-config
server# sshpass -p cisco scp switchN:running-config /srv/tftp/switchN-running-config
server# scp -3 192.168.X.101:/etc/docker/daemon.json gate:/etc/docker/daemon.json
==== Использование SSH Chroot ====
=== SSH вместо FTP (SFTP) ===
# cat /etc/ssh/sshd_config
...
# Subsystem sftp /usr/libexec/sftp-server
Subsystem sftp internal-sftp
...
Match group user1
#Match group group1
ChrootDirectory %h
ForceCommand internal-sftp
# chown root ~user1/
# mkdir ~user1/public_html && chown user1:user1 ~user1/public_html/
# mkdir ~user1/mail && chown user1:user1 ~user1/mail/
=== Chroot shell через SSH ===
==== SSH вместо XDM ====
gate# cat /etc/ssh/sshd_config
...
X11Forwarding yes
...
==== SSH вместо VPN (привязка к порту клиента) ====
windows desktop
Putty
Session
HostNameIP 192.168.X.10
Connection->SSH->Tunnels
Source port 3101
Destination 192.168.100+X.101:3389
linux desktop$ ssh -L 3101:192.168.100+X.101:3389 192.168.X.10
Remote Desktop Connection->127.0.0.1:3101
==== SSH вместо VPN (привязка к порту сервера) ====
* [[Управление сервисами в Linux]]
server# cat /etc/ssh/sshd_config
...
GatewayPorts yes
...
# cat /proc/sys/net/ipv4/ip_local_port_range
или
# sysctl net.ipv4.ip_local_port_range
lan# ssh -N -R 61022:localhost:22 -o ServerAliveInterval=60 student@server.corpX.un
lan# ssh -N -R 61389:192.168.100+X.1NN:3389 student@server.corpX.un
mobaxterm> ssh -N -R 61389:localhost:3389 student@server.corpX.un
mobaxterm> ssh -N -R 0:localhost:5500 student@server.corpX.un
===== Ограничение доступа к сервису SSH =====
==== Разрешение доступа пользователя root на основании адреса клиента ====
node2# cat sshd_config
...
#AllowUsers root user*@10.5.*.*
...
Match Address 192.168.*.*,172.16.*.*
PermitRootLogin yes
==== Управление доступом на основе членства в группе ====
Пример использования отдельного файла конфигурации
gate# cat /etc/ssh/sshd_config.d/my.conf
#AllowGroups sudo
#DenyGroups group1 group2
==== Запрет Forwarding портов ====
server# cat sshd_config
...
Match Group *,!sudo
X11Forwarding no
AllowTcpForwarding no
===== Уменьшение времени создания множества сессий =====
* [[https://developer.rackspace.com/blog/speeding-up-ssh-session-creation/|Speeding up SSH Session Creation]]
node1:~# cat ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600
node1# mkdir .ssh/sockets
===== Управление идентификацией =====
==== Отключение проверки публичных ключей серверов ====
$ cat ~/.ssh/config
StrictHostKeyChecking no
==== Парольная аутентификация ====
server# apt install sshpass
server# sshpass -p 'strongpassword' ssh vagrant@node1
server# sshpass -p cisco ssh switchN
server# sshpass -p cisco ssh switch1 sh int | grep line
==== Аутентификация с использованием ключей ssh ====
=== Настройка sshd на использование ключей ===
gate# less /etc/ssh/sshd_config
...
#PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys
...
=== Генерация ключей ===
user1@client1:~$ ssh-keygen
...
Enter passphrase (empty for no passphrase): password1
...
user1@client1:~$ ls .ssh/
=== Распространение публичных ключей ===
* ssh-copy-id
linux$ ssh-copy-id gate
linux$ ssh-copy-id server
freebsd$ ssh-copy-id -i .ssh/id_rsa.pub gate
* вручную
user1@client1$ ssh gate "mkdir .ssh"
user1@client1$ scp .ssh/id_rsa.pub gate:.ssh/authorized_keys
или
user1@client1$ cat .ssh/id_rsa.pub | ssh gate "cat >> .ssh/authorized_keys"
=== Использование ssh_agent ===
user1@client1$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-JaQgNr4492/agent.4492; export SSH_AUTH_SOCK;
SSH_AGENT_PID=4493; export SSH_AGENT_PID;
echo Agent pid 4493;
user1@client1$ SSH_AUTH_SOCK=/tmp/ssh-JaQgNr4492/agent.4492; export SSH_AUTH_SOCK;
user1@client1$ SSH_AGENT_PID=4493; export SSH_AGENT_PID;
или
user1@client1$ eval `ssh-agent -s`
user1@client1$ ssh-add
Enter passphrase for /root/.ssh/id_rsa:
...
student@client1$ ssh-add -l
...
user1@client1$ ssh gate
user1@client1$ ssh server
==== Аутентификация с использованием протокола GSSAPI ====
=== Регистрация принципалов сервиса в KDC и перемещение ключа сервиса на сервер ===
* [[https://www.altlinux.org/%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_SPN_%D0%B8_Keytab_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0|Создание SPN и Keytab файла при использовании DC Windows, DC FreeIPA, ...]]
== Debian/Ubuntu (MIT) ==
root@server:~# kadmin.local
kadmin.local: addprinc -randkey host/gate.corpX.un
...
kadmin.local: listprincs
kadmin.local: ktadd -k gatehost.keytab host/gate.corpX.un
...
kadmin.local: quit
server# scp gatehost.keytab gate:
== FreeBSD (Heimdal) ==
server# kadmin -l
kadmin> add -r host/gate.corpX.un
...
kadmin> list *
kadmin> ext -k gatehost.keytab host/gate.corpX.un
kadmin> quit
server# scp gatehost.keytab gate:
== Microsoft Active Directory ==
* Еще один способ: [[https://blog.it-kb.ru/2017/10/26/adding-spn-entries-in-keytab-on-linux-server-using-ktutil-associated-with-computer-account-in-active-directory-domain/|Добавление SPN записей в keytab-файл (на стороне сервера Linux с помощью утилиты ktutil), связанный с учётной записью Computer в домене Active Directory]]
Добавляем пользователя в AD
Login: gatehost
Password: Pa$$w0rd
Пароль не меняется и не устаревает
Связываем SPN ([[http://sysadminwiki.ru/wiki/Service_Principal_Name_%28SPN%29|Service Principal Name]]) host/gate.corpX.un@CORPX.UN с учетной записью gatehost
C:\>ktpass -princ host/gate.corpX.un@CORPX.UN -mapuser gatehost -pass 'Pa$$w0rd' -out gatehost.keytab
C:\>setspn -L -U gatehost
C:\>pscp gatehost.keytab gate:
== Samba4 ==
server# samba-tool user create gatehost
server# samba-tool user setexpiry gatehost --noexpiry
server# samba-tool spn add host/gate.corpX.un gatehost
server# samba-tool spn list gatehost
server# samba-tool domain exportkeytab gatehost.keytab --principal=host/gate.corpX.un
=== Добавление ключа в системный keytab ===
== Debian/Ubuntu (MIT) ==
root@gate:~# ktutil
ktutil: rkt /root/gatehost.keytab
ktutil: list
ktutil: wkt /etc/krb5.keytab
ktutil: quit
root@gate:~# klist -ek /etc/krb5.keytab
== FreeBSD (Heimdal) ==
gate# ktutil copy /root/gatehost.keytab /etc/krb5.keytab
gate# touch /etc/srvtab
gate# ktutil list
...
=== Настройка сервиса sshd на использование GSSAPI ===
gate# cat /etc/ssh/sshd_config
...
GSSAPIAuthentication yes
...
=== Настройка unix клиента ssh на использование GSSAPI ===
client1# less /etc/ssh/ssh_config
...
GSSAPIAuthentication yes
...
=== Настройка windows клиента (Centrify putty) на использование GSSAPI ===
Hostname: gate.corpX.un
SSH->Auth
Attempt "keyboard intractive": no
SSH->Kerberos
Attempt Kerberos Auth: yes
User name portion of user principal name: yes
=== Отладка ===
gate# kinit -V -k -t /etc/krb5.keytab host/gate.corpX.un@CORPX.UN
user1@client1$ kinit
user1@client1$ kinit -S host/gate.corpX.un@CORPX.UN
или
user1@client1$ kvno host/gate.corpX.un@CORPX.UN
user1@client1$ ssh -vv gate.corpX.un
gate# service ssh stop
gate# mkdir /run/sshd
gate# /usr/sbin/sshd -d
===== Дополнительные материалы =====
==== SSH сервер для Windows ====
* [[https://serverfault.com/questions/8411/what-is-a-good-ssh-server-to-use-on-windows]]
* [[https://social.technet.microsoft.com/Forums/ru-RU/f66a25ac-08ba-4131-9316-c681a5f6bf88/ssh-powershell]]
==== SSH терминал в web браузере ====
* [[http://xmodulo.com/access-ssh-terminal-web-browser-linux.html|How to access ssh terminal in web browser on Linux]]
* [[https://server.corpX.un:4200/]]
=== FreeBSD ===
# pkg install shellinabox
# service shellinaboxd onestart