====== 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]] - удобная оболочка для удалённого доступа.\\