== Полезные сетевые утилиты. Использование шифрования == === Полезные утилиты === Неполезные утилиты: `rsh` и `telnet` ==== netcat и другие ==== * Сервер (-l, -p порт) и клиент * UDP (-u) и unix domain (-U) * Всякое: пакетная отдача (-i секунды), тайм-аут (-w секунды). socks… Другие * [[http://www.dest-unreach.org/socat/doc/socat.html#EXAMPLES|socat]] * [[http://www.openssl.org/docs/apps/s_client.html|openssl s_client -connect]] ==== wget и другие ==== * [[http://www.gnu.org/software/wget/manual/wget.html|wget]] * [[http://curl.haxx.se/docs/manpage.html|curl]], [[http://lftp.yar.ru/lftp-man.html|lftp]], [[http://aria2.sourceforge.net/|aria2]]… ==== tcpdump ==== [[http://www.tcpdump.org/tcpdump_man.html|Документация]] === Сеть в VirtualBox === * интерфейсы и их режимы: NAT, мост, внутренняя сеть, … * работа «внутренней сети» * работа "NAT" режима * «проброс портов» * [[/static/LinuxNetwork2013/Nano.7z|Стенд]]: организация сети и проброс портов (часть `.ssh/config`): {{{ host nano Hostname localhost Port 2210 HostKeyAlias nano User root host nanoclient Hostname localhost Port 2211 HostKeyAlias nanoclient User root }}} === GnuPG === * Подпись и шифрование * доверенные и недоверенные ключи * сети доверия; падение уровней доверия * [[http://malpaso.ru/gpg-keysigning-party/|Как проводить встречи для подписи ключей GnuPG]] === Secure Shell, великий и могучий === * Шифрование и аутентификация * Ключ сервера и ключ пользователя: их применения * Первоначальный обмен ключами и man-in-the-middle * Проброс портов по защищённому каналу * SSH-Агент * Проблема доступа к ssh-агенту, ssh-askpass * Socks * … ! === Д/З === ==== Netcat ==== * Поговорить с самим собой с помощью `netcat`: {{{ [root@uneex ~]# nc -l 12345 … [root@uneexclient ~]# nc srv 12345 … }}} Для того, чтобы закрыть поток В/В, достаточно нажать "Ctrl+D" ==== Secure shell ==== * Зайти с клиента на сервер по `ssh`, почитать отладочную диагностику и обнаружить там имена файлов с ключами: {{{ [root@uneexclient ~]# ssh -v root@srv }}} * Сгенерировать ключ (защищённый кодовой фразой "123456"): {{{ [root@uneexclient ~]# rm -rf /root/.ssh/id_dsa && ssh-keygen -P123456 -t dsa -f /root/.ssh/id_dsa }}} * Повторять эту команду до тех пор, пока ASCII-арт отпечатка не покажется красивым * удалить файл `.ssh/known_hosts` и снова зайти на сервер. Увидеть диалог`The authenticity of host 'srv (10.30.50.1)' can't be established` и в нём отпечаток (обращаю внимание, что отвечать надо '''yes''', а не '''y'''). В отладочной информации увидеть, что предложенный ключ был отвергнут * Скопировать открытый ключ на сервер (надо будет ввести кодовую фразу): {{{ [root@uneexclient ~]# ssh-copy-id srv }}} * `ssh-copy-id` — это простой сценарий, запустить `sh -x ssh-copy-id srv` и посмотреть, какими командами что копируется * Ещё раз зайти на сервер (теперь вместо пароля надо будет вводить кодовую фразу) * Запустить ssh-агент (обратите внимание, что команда `ssh-agent` генерирует все остальные команды, их просто надо скопировать, и числа там будут другие) {{{ [root@uneexclient ~]# ssh-agent SSH_AUTH_SOCK=/root/tmp/ssh-XIglJWV12040/agent.12040; export SSH_AUTH_SOCK; SSH_AGENT_PID=12041; export SSH_AGENT_PID; [root@uneexclient ~]# SSH_AUTH_SOCK=/root/tmp/ssh-XIglJWV12040/agent.12040; export SSH_AUTH_SOCK; [root@uneexclient ~]# SSH_AGENT_PID=12041; export SSH_AGENT_PID; }}} Вместо всего этого можно было выполнять такую команду: {{{ [root@uneexclient ~]# eval `ssh-agent` }}} * Добавить в него ключ, посмотреть на ключ и зайти наконец-то без пароля! {{{ [root@uneexclient ~]# ssh-add -l The agent has no identities. [root@uneexclient ~]# ssh-add Enter passphrase for /root/.ssh/id_dsa: Identity added: /root/.ssh/id_dsa (/root/.ssh/id_dsa) [root@uneexclient ~]# ssh-add -l 1024 5c:5f:59:eb:97:ec:e0:fc:f7:18:1f:10:89:dd:f4:90 /root/.ssh/id_dsa (DSA) [root@uneexclient ~]# ssh srv Last login: Fri Nov 29 14:16:39 2013 from host13.class.altlinux.org }}} * Пробросить подключение с клиента на uneex.ru:80 на порт сервера 8001: {{{ [root@uneexclient ~]# ssh srv -R8001:www.ru:80 Last login: Fri Nov 29 14:25:26 2013 from host13.class.altlinux.org [root@uneex ~]# netlist | grep 8001 root 14358 sshd 8 tcp 127.0.0.1:8001 0.0.0.0:0 LISTEN [root@uneex ~]# links http://localhost:8001 … }}} * С помощью `tcpdump` убедиться, что трафик идёт так: сервер(localhost):8001 → клиент(ssh-тоннель):22 → www.ru:80 ==== GnuPG ==== * Импортировать открытый GPG-ключ и проверить его отпечаток: {{{ [root@uneex ~]# rm -rf $HOME/.gnupg [root@uneex ~]# gpg --list-keys [root@uneex ~]# gpg --recv-keys 7C10D900 [root@uneex ~]# gpg --fingerprint /root/.gnupg/pubring.gpg ------------------------ pub 1024D/7C10D900 2003-10-17 Key fingerprint = D01B B410 C69D AE98 8EB0 16F0 E1F0 3D6E 7C10 D900 }}} * Проверить подпись [[attachment:signed.txt|этого файла]]: {{{ [root@uneex ~]# curl 'https://uneex.ru/LecturesCMC/LinuxNetwork2013/09-SecurityAndTools?action=AttachFile&do=get&target=signed.txt' > signed.txt [root@uneex ~]# gpg --verify signed.txt }}} Обратите внимание, что ключ хотя и проверен, но вы лично не подписывали его, так что причин доверять ему нету. * Сгенерировать учёбный ключ ('''ВНИМАНИЕ!'''. Учётные данные в этом ключе менять '''не надо''', они исползуются для формирования отчёта. Вы можете нагенерировать ещё ключей, но этот надо оставить). {{{ [root@uneex ~]# echo " Key-Type: DSA Key-Length: 1024 Name-Real: Joe Tester Name-Comment: with stupid passphrase Name-Email: joe@foo.bar Expire-Date: 0 %commit " | gpg --batch --gen-key - }}} При появлении надписи (если вдруг) "Not enough random bytes available." придётся зайти в соседнюю консоль и нажимать на все подряд клавиши клавиатуры. В !VirtualBox с энтропией плоховато. * Подписать ключ 7C10D900 и снова проверить подпись {{{ [root@uneex ~]# gpg --sign-key 7C10D900 … [root@uneex ~]# gpg --verify signed.txt … }}}