Инструменты пользователя

Инструменты сайта


service:ssh

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
service:ssh [07.04.2023 10:38] – [Gitlab] viacheslavservice:ssh [07.03.2025 10:00] (текущий) – [Прочее] viacheslav
Строка 1: Строка 1:
 +====== SSH ======
 +<code bash>
 +# Создать пару ключей
 +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 пользователя на удалённом хосте.
 +</code>
 +Доступ будет с сервера с закрытым ключом на сервер, куда скопировали открытый.\\
 +{{: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
 +
 +===== Команды =====
 +<code bash>
 +# Ограничить разрешения на файл с закрытым ключом, иначе будет ругань при попытке соединения
 +chmod 600 .ssh/ssh_key
 +# Подключиться с указанием ключа и не спрашивать о добавлении отпечатка в ~/.ssh/known_hosts
 +ssh -i .ssh/ssh_key -o StrictHostKeyChecking=no user@server
 +</code>
 +
 +===== .ssh/config =====
 +''.ssh/config'' - настройки клиента. Сюда добавляются сгенерированные закрытые ключи для соединения с удалёнными серверами, самый простой пример: ''IdentityFile ~/.ssh/id_ed25519''. Также можно добавить опции:
 +<code bash>
 +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
 +</code>
 +
 +Опции в строку: 
 +<code bash>
 +ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host.com
 +# в случае с rsync, scp и т. д.
 +rsync -e 'ssh -o StrictHostKeyChecking=no' ...
 +</code>
 +[[https://wiki.enchtex.info/practice/ssh_accept_host_key|Автоматическое принятие RSA key клиентом SSH]]
 +
 +Устаревшие алгоритмы
 +<code bash>
 +# 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
 +</code>
 +
 +===== Windows =====
 +Чтобы не ругалось на права закрытого ключа и не спрашивало на добавление в known_hosts.
 +<file ini ~\.ssh\config>
 +Host *
 +  UserKnownHostsFile=/dev/null
 +  StrictHostKeyChecking=no
 +</file>
 +
 +:!: Worst practice - пароль хранится в скрипте, по возможности избегайте этого!
 +Шаблон подключения для Powershell (вставка пароля по ПКМ, если не настроен ключ в authorized_keys)
 +<code powershell>
 +$clip = Get-Clipboard
 +Set-Clipboard 'SSH_P@ssw0rd'
 +clear
 +& ssh.exe admin@server1-web
 +Set-Clipboard $clip
 +</code>
 +===== /etc/ssh/sshd_config =====
 +''/etc/ssh/sshd_config'' - настройки демона ssh. После правки надо перезапустить сервис - ''sudo systemctl restart ssh''.
 +<code bash>
 +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
 +</code>
 +https://www.opennet.ru/man.shtml?topic=sshd_config&category=5&russian=0
 +
 +===== Gitlab =====
 +Пайплайн для удалённых команд в shell.
 +  - Сгенерить ключи, добавить закрытый ключ в переменную ''$SSH_PRIVATE_KEY'' в Гитлабе
 +  - Добавить открытый ключ на сервер, к которому нужно подключаться, в файл ~/.ssh/authorized_keys пользователя, под которым будет подключение
 +  - Нарисовать этап в пайплайне
 +<code yaml>
 +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 "Привет"
 +      "
 +</code>
 +[[https://docs.gitlab.com/ee/ci/ssh_keys/|Using SSH keys with GitLab CI/CD]]
 +
 +===== haproxy =====
 +Для синхронизации конфигурации и сертификатов, выполняется под root
 +<code bash>
 +# Генерация ключа
 +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
 +</code>
 +
 +
 +===== Шифрование файлов ключами SSH =====
 +Это работает только с RSA-ключами. Шифрование открытым ключом, расшифровывание - закрытым. Ключи должны быть в формате PEM. \\
 +Открытый ключ можно получить из закрытого, поэтому в качестве исходного нужен только один закрытый ключ.
 +<code bash>
 +# 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
 +</code>
 +https://www.linuxquestions.org/questions/linux-security-4/openssl-error-unable-to-load-private-key-4175725374/
 +
 +Другой вариант - закрытый ключ, вытянутый в одну строку, используется как парольная фраза.\\
 +В принципе, можно использовать вообще любой файл.
 +<code bash>
 +# 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
 +</code>
 +Опция ''-kfile'' не используется, т. к. она читает из файла только первую строку (''%%-----BEGIN OPENSSH PRIVATE KEY-----%%''). Если убрать ''-out'', то будет вывод в stdout.
 +===== Прочее =====
 +[[https://mremoteng.org/|mRemoteNG]] - удобная оболочка для удалённого доступа.\\
 +
 +==== Автоматизация распространения открытого ключа ====
 +Есть 100 серверов с одинаковым паролем, надо разлить на них открытый ключ. Руками долго и муторно. Выручает sshpass.
 +<code bash>
 +sshpass -f password.txt ssh-copy-id -oStrictHostKeyChecking=no user@yourserver
 +</code>

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki