Комментарии 148
ssh ns1
вместо ssh -C family_n@lkt-srv-ns1.spb.companyname.ru, я понял, что ssh — это здорово.alias ns1='ssh -C family_n@lkt-srv-ns1.spb.companyname.ru'
и потом просто ns1
?По крайней мере я у себя прописал так. Правда я не знал про алиасы на уровне ssh
Имхо VPN лучше чем socks, и openvpn эту проблему решает отлично с port-share. Так что лично у меня для браузера 443 порт отдает страничку, а для openvpn туннель )
Главным же аргументом является минимализм. ssh есть и так и так, зачем лишний софт ставить? (И на сервер, и на рабочую станцию/ноутбук).
>> процентов 100% — мужского пола
Это можно и жирным выделить )) Спасибо, хорошо написано.
… вопрос про CompressionLevel. Он же, по man-у, только для ssh v1, который нынче принудительно включать надо.
Или есть подводные камни?
Я как-то на windows прокидывал X'ы (установил для этого putty и x-server для windows) и показывал java-приложение с headless-сервера под linux'ом. Было мерзко, рабоче.
Файлы передавал вообще через onedayfiles.com + wget.
Я придерживаюсь модели: один терминал — один ключ. На каждом ноуте/десктопе свой ключ. Один. Используется для работы с устройства.
Мотивация: спиз… т ноутбук (хоть у меня там ключ и под паролем), я буду точно знать, какой ключ отзывать (и он грепается по hostname в конце ключа).
Я не фанат всякой секьюрной хрени, но употребление общих ключей напоминает использование общей зубной щётки.
ControlPath /home/username/ssh-mastermode-%h-%p-%r
ControlMaster auto
~/tmp используйте или там ~/.ssh/socket какой-нить
а вот прямо ~/ это неприлично же, это все равно что справлять малую нужду на кухне.
если бы не знал, о чем речь — я бы точно не понял
чем, тот который ходит отличается от того, которым ходят — и кто из них где
Match group sftponly
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Если да — ключ сохраняется в файл ~/.ssh/known_hosts. Узнать, где какой ключ нельзя (ибо несекьюрно).Разве?
Находим в ~/.ssh/known_hosts строчку с искомым доменным именем/ip-адресом, у удаляем её. Всё, наш клиент забыл «отпечаток» того сервера.
cd /storage; tar cf — .snapshots | ssh root@192.168.0.1 tar xf — -C /storage
A sshfs можно подключать через fstab.
А компютер без интернета заведётся заведётся тогда, если в fstab прописать?
Все нелокальное лучше через systemd automount unit. Зашли в папочку — она примонтировалась, если это возможно.
Раньше для fstab были опции указания сетевых точек монтирования чтобы не блокировать загрузку при отсутствии сети или недоступности сетевой фс. Дистроспецифичные опции, но всё же. В современном мире, конечено, лучше и проще взять и написать тривиальный mount unit для systemd.
Решили проверить, выдержите ли хабраэффект?
Host shellbox.company
HostKeyAlias shellbox
Hostname public.address.for.shellbox.company.com
LocalForward 22001 server1.company.private.zone:22
LocalForward 22002 server2.company.private.zone:22
LocalForward 22003 server3.company.private.zone:22
...
Host r_server1.company.private.zone
HostKeyAlias server1.company.private.zone
Hostname 127.0.0.1
Port 22001
Host r_server2.company.private.zone
HostKeyAlias server2.company.private.zone
Hostname 127.0.0.1
Port 22002
...
После чего типовая схема работы с помощью такого VPN:
1. «Активировать» VPN, выполнив один раз «ssh shellbox.company» и оставив висеть это соединение
2. После этого просто дописывать некий префикс — например, как в примере — «r_» к имени серверов, на которые хочешь ходить — т.е. ходить на «r_server1.company.private.zone», когда хочешь оказаться на «server1.company.private.zone».
1. Появился недавно _и_ должен поддерживаться ssh-сервером на той стороне. Даже далеко не все современные (ну, плюс-минус современные) большие Linux его поддерживают, что уж говорить об инсталляциях на всяких Cisco и/или минималистичных вариантах вроде OpenWRT
2. Плохо себя ведет с ControlMaster — в зависимости от конфигурации ControlPath мы получаем либо создание отдельного ssh-соединения до публичной машины на каждый конечный хост, либо вообще невозможность работать более, чем с одной разной приватной машиной одновременно (зато с одной можно, да, поднимать сессии пачками и все будет ок).
Кстати, да, про ControlMaster тоже ничего не увидел в статье, а это, субъективно, одна из самых важных, если не самая важная, настройка в ssh.
У меня до работы канал сильно меньший (от 50 до 100 мегабит), но я не вижу никаких запросов «да, использовать ключ» или тормозов в работе автокомплита.
Но вернемся в наше время. У меня есть все хорошо, на сервер я хожу по ключам, использование ключей подтверждается, есть комплишен, сейчас, думаю, как белый человек, воспользуюсь.
Вариант «без ControlMaster»:
1. Пишу «scp s», нажимаю Tab.
2. Мне предлагают на выбор «server1», «server2», «server3» и т.д. Выбираю «server3». Дописываю ":/", нажимаю Tab еще раз.
3. Комплишен устанавливает новое соединение с server3. Обмен ключами практически в любом случае занимает минимум полсекунды. Затем выскакивает окошко «Allow use of key такой-то?». Поднимаю глаза на окошко, жму дополнительный Enter. Аутентификация, повторный обмен ключами, логин, открытие сессии и выполнение
ls
или echo *
на стороне сервера занимают еще с полсекунды. Получаю наконец-таки желанный список из "/bin", "/boot", "/cgroup", "/dev" и т.д.4. Желаю посмотреть "/var", пишу букву «v» и чтобы не допечатывать «ar» по привычке нажимаю Tab. Внезапно, для выполнения этого комплишен еще раз переподключается к серверу и я трачу еще минимум секунду и еще одно лишнее чтение окошка и нажатие Enter.
5. Шаг 4 еще, собственно, ничего даже не начал прояснять по поводу содержимого "/var". Дописываю "/", уже ругаясь, нажимаю Tab еще раз. Еще секунда и еще один Enter, наконец-то выведено содержимое "/var".
6. Если забыться и не написать «www» полностью руками или не выбрать его из списка (если используется zsh), то следующее «w» + Tab приведет еще раз к секунде ожидания и окошку.
…
n. Наконец-таки сделав свою задачу, через некоторое время обнаружить, что логи server3 загажены тоннами бессмысленных сообщений о подключениях вида:
Aug 1 00:00:03 server3 sshd[443955]: Accepted publickey for greycat from 11.22.33.44 port 43506 ssh2
Aug 1 00:00:04 server3 sshd[443962]: Received disconnect from 11.22.33.44: 11: disconnected by user
Aug 1 00:00:06 server3 sshd[443967]: Accepted publickey for greycat from 11.22.33.44 port 43507 ssh2
Aug 1 00:00:06 server3 sshd[443971]: Received disconnect from 11.22.33.44: 11: disconnected by user
Вариант «с ControlMaster»:
1. То же
2. То же
3. Если соединения с server3 нет, то то же. Если есть, то мгновенно делается _один_ вызов на уже установленном соединении и тут же появляется на экране результат. Один пакет туда, один-два с результатом обратно.
4..(n-1). Даже если окошко выпрыгивало для первого коннекта, то для всех последующих уже точно все будет быстро, как на локальной ФС, и без всяких дозапросов.
n. В логах ровно одно подключение, как и должно быть с точки зрения аккаунтинга: человек подключился, человек поработал, человек отключился.
По-моему, вариант «с ControlMaster» имеет некоторые преимущества?
А автокомплит занимает неощутимое время.
Засирание логов — может быть, но кого это реально волнует?
ssh-add -c
можно фактически в двух случаях:1. Либо совсем не пользоваться agent forwarding (-A)
2. Либо когда есть тотальная уверенность в том, что люди, которые могут получить доступ к auth-сокету агента, не воспользуются ключом не по назначению
Во всех других случаях, когда есть хоть какая-то толика недоверия к людям, имеющим root на удаленном сервере, я не вижу причин не использовать
ssh-add -c
— это хотя и надоедливая защита, но действенная.Про время — сейчас вот специально замерил, сколько у меня занимает установление соединения, хендшейки и выполнение 1 минимальной команды на соединении. Лучший получившийся результат (с одного относительно мощного сервера на другой аналогичный по линку в одном гигабитном свиче) — 680 мс при отключенном окошке подтверждения; типичный результат, к сожалению, в районе минуты — по нелокальным линкам, когда один из компьютеров медленнее другого и т.д. Для сравнение, худший результат с ControlMaster — 15 мс. В хороших случаях — 3-4 мс.
При более-менее быстрой скорости печати внезапная пауза в секунду (ну или даже в 0.7 с) при наборе, субъективно, малоприятна.
Засирание логов волнует, например, примерно каждую вторую IDS. Пару раз сталкивался с весьма жизненными ситуациями, когда человек вот так вот поконнектившись ~20 раз в минуту к серверу получал reject по IP-адресу, взведенный алерт в IDS типа «подозрительная активность на сервере N» и визит службы безопасности с разбирательством «у вас на компьютере вирус, который ломает сервер N».
Засирание логов действительно не важно, пока «безопасники» не начинают жаловаться (у некоторых компаний так вообще IDS лицензируются по кол-ву обрабатываемых сообщений). Да и самому приятнее потом в чистых логах разбираться, если нужно будет.
либо ssh разрешён (читай — делай что хочешь)
На самом деле для «делай что хочешь» достаточно хоть какой-то связи с внешним миром. Вполне себе есть работающие прокси и туннели на базе ICMP, на базе DNS, на базе побитовой передачи результатов единичных легитимных DNS-запросов и т.д.
Вся ж фича не в том, что это «в принципе возможно», а в том, что это комфортно и стандартно. И трафик никак не выделяется «нехарактерными» признаками.
Туннелировать хитрым образом через особенный внешний туннельный http-сервер умеют многие, например вот есть проект с незамысловатым названием HTTPTunnel (серверная часть на php, клиентская — на perl или в виде бинарника под Windows) или там Proxytunnel — примерно то же самое, но еще банальнее, работает прямо со stdin/stdout, очень легко подключается к ssh через ProxyCommand.
dag.wieers.com/howto/ssh-http-tunneling/
хочется подробностей про L2 over ssh и рецепт wake-up-on-lan через ssh
в своё время вперёд выставлял Blowfish и скорость существенно возрастала.
по умолчанию установлено что-то типа
Cipher 3des
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
tar -c * | ssh user@server cd && tar -x
Блин. Классно. А то я делал как-то так:
tar -cvf — -C upload. | ssh user@server tar -xpvf — -C /var/spool/www/upload/
А разве тут не должно было быть
tar -c * | ssh user@server "cd && tar -x"
чтобы "&& tar -x" улетело в удалённый шелл, а не локальный?
ssh example.com -t "cd /www/example.com && git status -sb | head -1"
P.S.
Ещё большая драма, если у нас есть нестандартный порт, и, например, первая версия ssh (привет цискам).
Привет от цисок: ip ssh version 2
HashKnownHosts no
StrictHostKeyChecking no
в конфиге. После этого выключаются дурацкие вопросы про добавление в known hosts (yes/no), равно как и параноя про man-in-the-middle.
Но копировать его на 8.8.8.8 мы не хотим, ибо там проходной двор и половина людей имеет sudo и может шариться по чужим каталогам.
Стало быть, многие имеют рутовый доступ к DNS серверу гугла? Странно, что никто не обратил внимание на сей факт в статье
Добавление смайликов к моему предыдущему сообщению подсказало бы, что оно носило саркастический характер. Но смайлы на хабре не котируются.Но копировать его на 8.8.8.8 мы не хотим, ибо там проходной двор и половина людей имеет sudo и может шариться по чужим каталогам.
Есть такая софтина redsocks — умеет заворачивать весь исходящий траф на определенный порт, а на этом порту мы и запускаем ssh -fNL…
К софтине правда еще прилагаются несколько правил iptables.
Ну и пара «интересностей» ещё:
1. ControlMaster — уже упомянули пару раз в комментах.
2. Извлечение public ключа из private:
ssh-keygen -y -f id_rsa > id_rsa.pub
3. pam-ssh-agent-auth тоже интересная штука, особенно в комбинации с вышеописанным authorized_keys2
4.
ssh-keyscan
бывает полезна, впрочем любители chef/puppet/cfengine могут собирать ключики с машин более эффективным образом.5. В последних версиях OpenSSH начали использовать Elliptic Curve DSA
либо ssh разрешён (читай — делай что хочешь), либо ssh запрещён
Либо ssh разрешён строго на определённые адреса, необходимые для работы.
В качестве дополнения — есть ещё замечательня утилита
corkscrew
(доступна в т. ч. и на Cygwin), позволяющая для установления SSH-соединения использовать HTTP-прокси. Необходимо соблюдение двух условий:- прокси-сервер должен разрешать HTTPS CONNECT;
- SSH-сервер должен «слушать» на порту 443 (в мире сурового ынтырпрайза HTTPS CONNECT на порт, отличный от 443, обычно запрещают).
Ремарка: PuTTY умеет использовать HTTP прокси своими силами, обходясь без
corkscrew
.В результате фрагмент конфигурации будет выглядеть так:
Host home
Hostname ...
User ...
Compression yes
Port 443
ProxyCommand corkscrew webcache.mycompany.com 8080 %h %p
После этого «хождение» на все остальные SSH-сервера достигается тривиальным образом:
Host ...
Hostname ...
User ...
Compression yes
Port ...
ProxyCommand ssh -W %h:%p home
Если Linux-сервер без GUI, то инициализируем глобальную переменную DISPLAY:
$ DISPLAY=localhost:10.0
$ export DISPLAY
И вот уже RDP наружу совсем не нужен.
У меня есть, что добавить. Проброс SSH через HTTP proxy с методом CONNECT
Вот конфиг для использования nc:
host github.com
user git
hostname github.com
port 22
proxycommand nc --proxy proxy.example.com:1234 %h %p
Если под Windows используется git, то вместе с git устанавливается инструмент под названием connect.exe, который используется так:
host github.com
user git
hostname github.com
port 22
proxycommand "C:\Program Files\Git\mingw64\bin\connect.exe" -H proxy.example.com:1234 %h %p
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 1025-65535 # unregistered ports
acl CONNECT method CONNECT
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
Понекропостю немного, но чем черт не шутит.
Может ли кто поделиться простой, или относительно простой, или хотя бы не требующей слишком много телодвижений и реконфигураций командой/алиасом/функцией/магией для того чтобы залить файл с локальной машины в удаленный докер-контейнер? Но так чтобы при этом случайно не призвался ктулху и душу никому продавать не пришлось. Можно iTerm2-specific даже (он, к примеру, позволяет прямо из shell'а скачивать, если установлены integration tools, а вот в обратную сторону - уже не очень).
Если это разовая операция, то посмотрите в сторону docker cp
.
Если файл требуется обновлять на постоянной основе, то в сторону docker volumes.
cat local_file | ssh remote_server sudo docker cp - container_name:/path/in_containerner
Но с правами придётся всё равно возиться, если в контейнере не от рута.
Памятка пользователям ssh