service:ssh
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
service:ssh [26.09.2022 19:10] – [SSH] viacheslav | service: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 — путь к файлу ключа (по умолчанию ~/ | ||
+ | # -C — комментарий к ключу (по умолчанию username@hostname) | ||
+ | # -P — пароль для доступа к ключу | ||
+ | # более защищённый аглоритм, | ||
+ | ssh-keygen -t ed25519 -C " | ||
+ | |||
+ | # Скопировать открытый ключ на другую машину | ||
+ | ssh-copy-id username@remote_host | ||
+ | # можно просто | ||
+ | ssh-copy-id remote_host # если имя пользователя одинаковое | ||
+ | # скопировать другой ключ | ||
+ | ssh-copy-id -i ~/ | ||
+ | # скопирует содержимое файла открытого ключа из ~/ | ||
+ | # в каталоге ~/.ssh пользователя на удалённом хосте. | ||
+ | </ | ||
+ | Доступ будет с сервера с закрытым ключом на сервер, | ||
+ | {{: | ||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | В целях защиты от компрометации закрытого ключа настоятельно рекомендуется защищать его паролем, | ||
+ | |||
+ | Закрытый ключ, созданный ssh-keygen, для putty не годится, | ||
+ | |||
+ | Также в составе PuTTY имеется Pageant - позволяет загрузить приватный ключ заранее, | ||
+ | https:// | ||
+ | |||
+ | ===== Команды ===== | ||
+ | <code bash> | ||
+ | # Ограничить разрешения на файл с закрытым ключом, | ||
+ | chmod 600 .ssh/ | ||
+ | # Подключиться с указанием ключа и не спрашивать о добавлении отпечатка в ~/ | ||
+ | ssh -i .ssh/ | ||
+ | </ | ||
+ | |||
+ | ===== .ssh/config ===== | ||
+ | '' | ||
+ | <code bash> | ||
+ | StrictHostKeyChecking no # автоматически добавить сервер в ~/ | ||
+ | UserKnownHostsFile=/ | ||
+ | #RequestTTY force | ||
+ | # | ||
+ | |||
+ | # Для gitlab runner | ||
+ | Host gitlab-runner | ||
+ | HostName 192.168.1.40 | ||
+ | User vasya | ||
+ | ForwardAgent yes | ||
+ | IdentityFile ~/ | ||
+ | ProxyJump jproxy | ||
+ | | ||
+ | # Для всех, кроме gitlab-runner | ||
+ | Host * !gitlab-runner | ||
+ | ControlMaster auto | ||
+ | ControlPath ~/ | ||
+ | ControlPersist 600 | ||
+ | StrictHostKeyChecking no | ||
+ | UserKnownHostsFile=/ | ||
+ | ServerAliveInterval 30 | ||
+ | ServerAliveCountMax 25 | ||
+ | ForwardAgent yes | ||
+ | </ | ||
+ | |||
+ | Опции в строку: | ||
+ | <code bash> | ||
+ | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/ | ||
+ | # в случае с rsync, scp и т. д. | ||
+ | rsync -e 'ssh -o StrictHostKeyChecking=no' | ||
+ | </ | ||
+ | [[https:// | ||
+ | |||
+ | Устаревшие алгоритмы | ||
+ | <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 | ||
+ | </ | ||
+ | |||
+ | ===== Windows ===== | ||
+ | Чтобы не ругалось на права закрытого ключа и не спрашивало на добавление в known_hosts. | ||
+ | <file ini ~\.ssh\config> | ||
+ | Host * | ||
+ | UserKnownHostsFile=/ | ||
+ | StrictHostKeyChecking=no | ||
+ | </ | ||
+ | |||
+ | :!: Worst practice - пароль хранится в скрипте, | ||
+ | Шаблон подключения для Powershell (вставка пароля по ПКМ, если не настроен ключ в authorized_keys) | ||
+ | <code powershell> | ||
+ | $clip = Get-Clipboard | ||
+ | Set-Clipboard ' | ||
+ | clear | ||
+ | & ssh.exe admin@server1-web | ||
+ | Set-Clipboard $clip | ||
+ | </ | ||
+ | ===== / | ||
+ | ''/ | ||
+ | <code bash> | ||
+ | Port 22 | ||
+ | Protocol | ||
+ | UsePAM | ||
+ | PermitRootLogin | ||
+ | PasswordAuthentication | ||
+ | PermitEmptyPasswords | ||
+ | PubkeyAuthentication | ||
+ | AllowTcpForwarding | ||
+ | X11Forwarding | ||
+ | StrictModes | ||
+ | UsePAM | ||
+ | PrintMotd | ||
+ | PrintLastLog | ||
+ | TCPKeepAlive | ||
+ | UseDNS | ||
+ | LoginGraceTime | ||
+ | maxauthtries | ||
+ | Subsystem | ||
+ | AcceptEnv | ||
+ | AllowAgentForwarding | ||
+ | ChallengeResponseAuthentication no | ||
+ | AllowUsers | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ===== Gitlab ===== | ||
+ | Пайплайн для удалённых команд в shell. | ||
+ | - Сгенерить ключи, добавить закрытый ключ в переменную '' | ||
+ | - Добавить открытый ключ на сервер, | ||
+ | - Нарисовать этап в пайплайне | ||
+ | <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 " | ||
+ | - mkdir -p ~/.ssh | ||
+ | - chmod 600 ~/.ssh | ||
+ | script: | ||
+ | - | | ||
+ | ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/ | ||
+ | id | ||
+ | ls ~ | ||
+ | echo " | ||
+ | " | ||
+ | </ | ||
+ | [[https:// | ||
+ | |||
+ | ===== haproxy ===== | ||
+ | Для синхронизации конфигурации и сертификатов, | ||
+ | <code bash> | ||
+ | # Генерация ключа | ||
+ | ssh-keygen -t ed25519 | ||
+ | # Включить возможность входа под рутом | ||
+ | echo " | ||
+ | # Рестарт ssh для применения настроек | ||
+ | systemctl restart ssh | ||
+ | # Вывести открытый ключ и скопировать его в буфер обмена | ||
+ | cat ~/ | ||
+ | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJvFD1ALkXfbmFaH7A5IQJ+EGD8I9A1SxqVX2z+6Wrts root@srv-haproxy1 | ||
+ | |||
+ | # На другом сервере (также под root) вставить открытый ключ из буфера в файл: | ||
+ | nano / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Шифрование файлов ключами SSH ===== | ||
+ | Это работает только с RSA-ключами. Шифрование открытым ключом, | ||
+ | Открытый ключ можно получить из закрытого, | ||
+ | <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 | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | Другой вариант - закрытый ключ, вытянутый в одну строку, | ||
+ | В принципе, | ||
+ | <code bash> | ||
+ | # Encrypt | ||
+ | openssl enc -aes-256-cbc -pbkdf2 -k "$(cat ~/ | ||
+ | # Decrypt | ||
+ | openssl enc -aes-256-cbc -pbkdf2 -k "$(cat ~/ | ||
+ | </ | ||
+ | Опция '' | ||
+ | ===== Прочее ===== | ||
+ | [[https:// | ||
+ | |||
+ | ==== Автоматизация распространения открытого ключа ==== | ||
+ | Есть 100 серверов с одинаковым паролем, | ||
+ | <code bash> | ||
+ | sshpass -f password.txt ssh-copy-id -oStrictHostKeyChecking=no user@yourserver | ||
+ | </ |