====== SSH ======
# Создать пару ключей
ssh-keygen -t rsa -b 4096
# В каталоге ~/.ssh появляются id_rsa (закрытый ключ) и id_rsa.pub (открытый ключ)
# -t — тип ключа
# -b — длина ключа в битах (по умолчанию 3072 для RSA)
# -f — путь к файлу ключа (по умолчанию ~/.ssh/id_rsa)
# -C — комментарий к ключу (по умолчанию username@hostname)
# -P — пароль для доступа к ключу
# более защищённый аглоритм, и открытый ключ гораздо короче, чем у RSA
ssh-keygen -t ed25519 -C "my-laptop"
# Скопировать открытый ключ на другую машину
ssh-copy-id username@remote_host
# можно просто
ssh-copy-id remote_host # если имя пользователя одинаковое
# скопировать другой ключ
ssh-copy-id -i ~/.ssh/random_key.pub admin@remote_host
# скопирует содержимое файла открытого ключа из ~/.ssh/id_rsa.pub в файл authorized_keys
# в каталоге ~/.ssh пользователя на удалённом хосте.
Доступ будет с сервера с закрытым ключом на сервер, куда скопировали открытый.\\
{{:service:pasted:20230517-132259.png}}
https://www.ssh.com/ssh/keygen/\\
https://medium.com/risan/upgrade-your-ssh-key-to-ed25519-c6e8d60d3c54
В целях защиты от компрометации закрытого ключа настоятельно рекомендуется защищать его паролем, если только ключ не будет использоваться для автоматизации.
Закрытый ключ, созданный ssh-keygen, для putty не годится, и нужно либо генерить его там изначально, либо открывать уже созданный закрытый ключ в [[https://www.ssh.com/ssh/putty/windows/puttygen|PuTTYgen]] и конвертировать.
Также в составе PuTTY имеется Pageant - позволяет загрузить приватный ключ заранее, и затем передавать PuTTY данные аутентификации - PuTTY изначально пытается связаться с Pageant для получения данных. Ключ можно задавать аргументом к pageant.exe. Если в настройках PuTTY -> Connection -> Data задать ещё и логин, то вход будет полностью автоматическим.\\
https://www.youtube.com/watch?v=2nkAQ9M6ZF8
===== Команды =====
# Ограничить разрешения на файл с закрытым ключом, иначе будет ругань при попытке соединения
chmod 600 .ssh/ssh_key
# Подключиться с указанием ключа и не спрашивать о добавлении отпечатка в ~/.ssh/known_hosts
ssh -i .ssh/ssh_key -o StrictHostKeyChecking=no user@server
===== .ssh/config =====
''.ssh/config'' - настройки клиента. Сюда добавляются сгенерированные закрытые ключи для соединения с удалёнными серверами, самый простой пример: ''IdentityFile ~/.ssh/id_ed25519''. Также можно добавить опции:
StrictHostKeyChecking no # автоматически добавить сервер в ~/.ssh/known_hosts
UserKnownHostsFile=/dev/null # Чтобы не добавлять каждый раз запись к known_hosts, если IP сервера динамический
#RequestTTY force
#LogLevel=quiet
# Для gitlab runner
Host gitlab-runner
HostName 192.168.1.40
User vasya
ForwardAgent yes
IdentityFile ~/.ssh/id_rsa
ProxyJump jproxy
# Для всех, кроме gitlab-runner
Host * !gitlab-runner
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 600
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
ServerAliveInterval 30
ServerAliveCountMax 25
ForwardAgent yes
Опции в строку:
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host.com
# в случае с rsync, scp и т. д.
rsync -e 'ssh -o StrictHostKeyChecking=no' ...
[[https://wiki.enchtex.info/practice/ssh_accept_host_key|Автоматическое принятие RSA key клиентом SSH]]
Устаревшие алгоритмы
# Unable to negotiate with 192.168.1.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
# Unable to negotiate with 192.168.1.1 port 22: no matching host key type found. Their offer: ssh-rsa
ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o StrictHostKeyChecking=no user@192.168.1.1
===== Windows =====
Чтобы не ругалось на права закрытого ключа и не спрашивало на добавление в known_hosts.
Host *
UserKnownHostsFile=/dev/null
StrictHostKeyChecking=no
:!: Worst practice - пароль хранится в скрипте, по возможности избегайте этого!
Шаблон подключения для Powershell (вставка пароля по ПКМ, если не настроен ключ в authorized_keys)
$clip = Get-Clipboard
Set-Clipboard 'SSH_P@ssw0rd'
clear
& ssh.exe admin@server1-web
Set-Clipboard $clip
===== /etc/ssh/sshd_config =====
''/etc/ssh/sshd_config'' - настройки демона ssh. После правки надо перезапустить сервис - ''sudo systemctl restart ssh''.
Port 22
Protocol 2
UsePAM yes
PermitRootLogin no
PasswordAuthentication yes
PermitEmptyPasswords no
PubkeyAuthentication yes
AllowTcpForwarding no
X11Forwarding no
StrictModes yes
UsePAM yes
PrintMotd no
PrintLastLog no
TCPKeepAlive yes
UseDNS no
LoginGraceTime 1m
maxauthtries 4
Subsystem sftp internal-sftp
AcceptEnv LANG LC_*
AllowAgentForwarding yes
ChallengeResponseAuthentication no
AllowUsers vasya root@IP
https://www.opennet.ru/man.shtml?topic=sshd_config&category=5&russian=0
===== Gitlab =====
Пайплайн для удалённых команд в shell.
- Сгенерить ключи, добавить закрытый ключ в переменную ''$SSH_PRIVATE_KEY'' в Гитлабе
- Добавить открытый ключ на сервер, к которому нужно подключаться, в файл ~/.ssh/authorized_keys пользователя, под которым будет подключение
- Нарисовать этап в пайплайне
stages:
- deploy
deploy-job:
stage: deploy
before_script:
# устанавливаем ssh-agent, если ещё не
- 'which ssh-agent > /dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
# сохраняем сгенеренный ранее приватный ключ для раннера
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 600 ~/.ssh
script:
- |
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@192.168.4.5 "
id
ls ~
echo "Привет"
"
[[https://docs.gitlab.com/ee/ci/ssh_keys/|Using SSH keys with GitLab CI/CD]]
===== haproxy =====
Для синхронизации конфигурации и сертификатов, выполняется под root
# Генерация ключа
ssh-keygen -t ed25519
# Включить возможность входа под рутом
echo "PermitRootLogin yes" > /etc/ssh/sshd_config.d/root
# Рестарт ssh для применения настроек
systemctl restart ssh
# Вывести открытый ключ и скопировать его в буфер обмена
cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJvFD1ALkXfbmFaH7A5IQJ+EGD8I9A1SxqVX2z+6Wrts root@srv-haproxy1
# На другом сервере (также под root) вставить открытый ключ из буфера в файл:
nano /root/.ssh/authorized_keys
===== Шифрование файлов ключами SSH =====
Это работает только с RSA-ключами. Шифрование открытым ключом, расшифровывание - закрытым. Ключи должны быть в формате PEM. \\
Открытый ключ можно получить из закрытого, поэтому в качестве исходного нужен только один закрытый ключ.
# Create key pair if needed
ssh-keygen -f id_rsa -t rsa -P ""
# Convert public key to PEM
ssh-keygen -f id_rsa -e -m PEM > id_rsa.pub.pem
# Encrypt file (rsautl deprecated, use pkeyutl on new systems)
openssl rsautl -encrypt -inkey id_rsa.pub.pem -pubin -in pass.txt -out pass.enc
# Convert private key to PEM (copy because private key overwrites)
cp id_rsa id_rsa.pem
ssh-keygen -f id_rsa.pem -p -m PEM -N ""
# Decrypt file
openssl rsautl -decrypt -inkey id_rsa.pem -in pass.enc > pass2.txt
https://www.linuxquestions.org/questions/linux-security-4/openssl-error-unable-to-load-private-key-4175725374/
Другой вариант - закрытый ключ, вытянутый в одну строку, используется как парольная фраза.\\
В принципе, можно использовать вообще любой файл.
# Encrypt
openssl enc -aes-256-cbc -pbkdf2 -k "$(cat ~/.ssh/id_ed25519 |tr -d '\n')" -in pass.txt -out pass.enc
# Decrypt
openssl enc -aes-256-cbc -pbkdf2 -k "$(cat ~/.ssh/id_ed25519 |tr -d '\n')" -in pass.enc -out pass2.txt -d
Опция ''-kfile'' не используется, т. к. она читает из файла только первую строку (%%-----BEGIN OPENSSH PRIVATE KEY-----%%). Если убрать ''-out'', то будет вывод в stdout.
===== Прочее =====
[[https://mremoteng.org/|mRemoteNG]] - удобная оболочка для удалённого доступа.\\