<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Apple Geek &#187; ssh</title>
	<atom:link href="http://theapplegeek.ru/archives/tag/ssh/feed" rel="self" type="application/rss+xml" />
	<link>http://theapplegeek.ru</link>
	<description>Чему ты научился сегодня?</description>
	<lastBuildDate>Fri, 30 Jul 2010 13:48:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>autossh и доступ к внешним репозиториям git</title>
		<link>http://theapplegeek.ru/archives/3856</link>
		<comments>http://theapplegeek.ru/archives/3856#comments</comments>
		<pubDate>Tue, 25 May 2010 10:10:13 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3856</guid>
		<description><![CDATA[Представим ситуацию &#8211; есть сервер, соединение с которым должно быть всегда активным, даже если в shell нет никакой активности. Или же должен постоянно работать туннель ssh. Обычный ssh при разрыве соединения не производит его переустановку (разве что можно посылать alive-пакеты, но это действует для активных сессий: ssh -o ServerAliveInterval=10 host.com). Вот, например, такую картину я [...]]]></description>
			<content:encoded><![CDATA[<p>Представим ситуацию &#8211; есть сервер, соединение с которым должно быть всегда активным, даже если в shell нет никакой активности. Или же должен постоянно работать <a href="http://theapplegeek.ru/archives/2285" >туннель ssh</a>. Обычный ssh при разрыве соединения не производит его переустановку (разве что можно посылать alive-пакеты, но это действует для активных сессий: ssh -o ServerAliveInterval=10 host.com).</p>
<p>Вот, например, такую картину я вижу постоянно при соединении со своим сервером, когда сессия неактивна долгое время:</p>
<pre>
$ ssh host.com
<small>Linux host.com 2.6.32.12-linode25 #1 SMP Wed Apr 28 19:25:11 UTC 2010 i686</small>

20:51 [ctrld@host][~]
17:14 [ctrld@host][~] Write failed: Broken pipe
</pre>
<p>Через какое-то время я получаю &#8220;Write failed: Broken pipe&#8221;. В данном случае переподключиться вручную просто, но всегда найдётся ситуация, когда это сделать гораздо труднее.</p>
<p><span id="more-3856"></span></p>
<p>Но есть полезная терминальная программа <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.harding.motd.ca/autossh/" >autossh</a></noindex>. Она запускает ssh, производит мониторинг сессии и при необходимости её рестартует.</p>
<p>Устанавливаем autossh с помощью <a href="http://theapplegeek.ru/archives/3570" >Homebrew</a>:</p>
<pre>
$ brew update
$ brew install autossh
</pre>
<p>Ключи (если они необходимы) аналогичны ключам ssh, а особенности можно посмотреть в &#8220;man autossh&#8221;.</p>
<p>Теперь моя сессия с сервером держится до момента, когда я сам не выйду:</p>
<pre>
$ autossh host.com
<small>Linux host.com 2.6.32.12-linode25 #1 SMP Wed Apr 28 19:25:11 UTC 2010 i686</small>

10:03 [ctrld@host][~]
...
20:39 [ctrld@host][~] logout
</pre>
<p>На идею использования autossh меня натолкнуло обсуждение на <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://stackoverflow.com/questions/1264262/connecting-to-gitosis-server-through-an-ssh-tunnel" >StackOverflow</a></noindex> по поводу организации доступа к внешним репозиториям git с хостов, которые не могут напрямую соединиться с ним по ssh.</p>
<p>Идея решения такова &#8211; в локальной сети должен быть хост dmz.host.com, имеющий возможность соединения по ssh с внешним репозиторием. Через этот хост строится туннель <a href="http://theapplegeek.ru/archives/2285" >ssh</a>:</p>
<pre>
internal.host.com$ autossh -M 20000 -f -N -L 2222:git.host.com:22 user@dmz.host.com
</pre>
<p>Затем на внутреннем хосте в <a href="http://theapplegeek.ru/archives/3729" >~/.ssh/config</a> описывается, что нужно ходить на репозитории через туннель:</p>
<pre>
Host git.host.com
        HostName localhost
        Port 2222
</pre>
<p>Уточню &#8211; я пока этот рецепт не использую и работоспособность не протестировал. Однако всё выглядит очень правдоподобно.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3856/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Туннелирование SSH через HTTP-прокси (corkscrew)</title>
		<link>http://theapplegeek.ru/archives/3817</link>
		<comments>http://theapplegeek.ru/archives/3817#comments</comments>
		<pubDate>Thu, 13 May 2010 10:07:21 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3817</guid>
		<description><![CDATA[Давно я не писал про преодоление защиты сетей. Наверстываю. Все разы, когда я ездил за границу, в отелях практически всегда был нормальный доступ по WiFi на базе NAT (в основном через transparent proxy для авторизации, но никаких телодвижений по настройке прокси со стороны клиента не требовалось). Только два раза я натыкался на &#8220;тупые&#8221; конфигурации &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p style="clear: both"><img src="http://theapplegeek.ru/wp-content/uploads/2010/05/01_corkscrew-thumb1.png" height="200" align="right" width="160" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Давно я не писал про преодоление защиты сетей. Наверстываю.</p>
<p>Все разы, когда я ездил за границу, в отелях практически всегда был нормальный доступ по WiFi на базе NAT (в основном через transparent proxy для авторизации, но никаких телодвижений по настройке прокси со стороны клиента не требовалось). Только два раза я натыкался на &#8220;тупые&#8221; конфигурации &#8211; один раз в московском отеле, другой &#8211; в Амстердаме. Для работы приходилось прописывать прокси, руководствуясь информацией, полученной на receiption.</p>
<p>Конечно же, ssh через web-прокси не работает. Как назло во втором случае мне было очень нужно попасть на мой сервер. Я собирался выкручиваться путём записи на свой сайт скрипта, обеспечивающего доступ к shell, например, <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.askapache.com/ajax/php-and-ajax-shell-console.html" >PHP and AJAX shell console</a></noindex>, но <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/andy_shev" >@andy_shev</a></noindex> мне порекомендовал <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.agroman.net/corkscrew/README" >corkscrew</a></noindex>, утилиту для туннелирования SSH поверх HTTP-прокси. Ею я и воспользовался, за что Andy огромное спасибо.</p>
<p><span id="more-3817"></span></p>
<p>Одно &#8220;но&#8221;. Corkscrew использует метод CONNECT, а squid, использующийся в качестве web-прокси в большинстве случаев, в конфигурации по умолчанию разрешает CONNECT только на порт 443:</p>
<pre>
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
</pre>
<p>Поэтому corkscrew выдаст &#8220;Proxy could not open connnection to host.com: Forbidden&#8221; при попытке соединения на любой порт, на котором обычно вешается ssh. Мне повезло, так как я на своём сервере держал ssh на порту 443. Если и вы собираетесь воспользоваться corkscrew, то предварительно перекиньте ssh на 443/tcp.</p>
<p>Приступим. Я использую менеджер пакетов <a href="http://theapplegeek.ru/archives/3570" >HomeBrew</a>.</p>
<p>Обновляемся:</p>
<pre>
$ brew update
</pre>
<p>Ставим corkscrew:</p>
<pre>
$ brew install corkscrew
</pre>
<p>Предположим, прокси-сервер находится на адресе 192.168.99.101 и порту 3128. Добавляем в начало конфиг-файла ssh строки:</p>
<pre>
$ vim ~/.ssh/config
Host *
    ProxyCommand /usr/local/bin/corkscrew 192.168.99.101 3128 %h %p
</pre>
<p>Если ssh находится не на порту 443, и squid разрешает только порт 443, то получим сообщение (при указании флага &#8220;-v&#8221;):</p>
<pre>
$ ssh -v host.com
<small>...
debug1: Reading configuration data /etc/ssh_config
debug1: Executing proxy command: exec /usr/local/bin/corkscrew 192.168.99.101 3128 host.com 22
...
<b>Proxy could not open connnection to host.com:  Forbidden
ssh_exchange_identification: Connection closed by remote host</b></small>
</pre>
<p>Для решения проблемы нужно предварительно в конфиг-файле sshd на сервере поменять порт на 443 и перезапустить sshd (конечно же, на этом хосте не должен стоять web-сервер с https):</p>
<pre>
$ vim /etc/ssh/sshd_config
Port 443
</pre>
<p>Перезапуск sshd для разных систем делается по-своему, я делаю это через &#8220;ps ax | grep sshd&#8221;, а потом перезапускаю нужный sshd.</p>
<p>Всё, можно пользоваться:</p>
<pre>
$ ssh -v -p 443 host.com
<small>Linux host.com 2.6.32-linode23 #1 SMP Sat Dec 5 16:04:55 UTC 2009 i686

12:02 [ctrld@host][~] </small>
</pre>
<p>Решений для выход за пределы сети существует много. Описанный мною метод &#8211; только один из многих. Любой грамотный IT-специалист навскидку найдёт несколько вариантов, и по крайней мере один из них будет вполне рабочим. Поэтому я всегда скептически отношусь к заявлениям &#8220;Специалистов По Корпоративной Безопасности&#8221;, что они способны закрыть доступ.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3817/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Упрощение работы с ssh путём описания хостов в конфигурации</title>
		<link>http://theapplegeek.ru/archives/3729</link>
		<comments>http://theapplegeek.ru/archives/3729#comments</comments>
		<pubDate>Tue, 13 Apr 2010 15:29:12 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Quick Tips]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=3729</guid>
		<description><![CDATA[Много ли вы работаете с удалёнными хостами по SSH? Если да, то вы уже привыкли набирать команду вида: $ ssh 10.10.10.10 Если для немного большей защиты ssh-сервер находится на нестандартном порту, то команда слегка усложняется: $ ssh -p 12345 10.10.10.10 А если имена пользователей не совпадают на разных системах, то команда ещё усложняется: $ ssh [...]]]></description>
			<content:encoded><![CDATA[<p>Много ли вы работаете с удалёнными хостами по SSH? Если да, то вы уже привыкли набирать команду вида:</p>
<pre>
$ ssh 10.10.10.10
</pre>
<p>Если для немного большей защиты ssh-сервер находится на нестандартном порту, то команда слегка усложняется:</p>
<pre>
$ ssh -p 12345 10.10.10.10
</pre>
<p>А если имена пользователей не совпадают на разных системах, то команда ещё усложняется:</p>
<pre>
$ ssh -p 12345 username@10.10.10.10
</pre>
<p><span id="more-3729"></span></p>
<p>Или вот команда копирования файла (не правда ли, бывает путаница между &#8220;-p&#8221; и &#8220;-P&#8221;):</p>
<pre>
$ scp -P 12345 filename.zip username@10.10.10.10:
</pre>
<p>Но всё можно упростить. Для этого нужно в файл ~/.ssh/config внести свои хосты, например:</p>
<pre>
Host srv
    User username
    Port 12345
    HostName 10.10.10.10
</pre>
<p>И тогда вы с облегчением вздохнёте, вместо длинной команды начав набирать:</p>
<pre>
$ ssh srv
$ scp filename.zip srv:
</pre>
<p>Хостов можно определить много.</p>
<p>И ещё один хинт. Если у вас есть несколько рабочих систем, то файл .ssh/config можно вполне синхронизировать через Dropbox.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/3729/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Решение проблемы с русскими буквами при соединении через ssh</title>
		<link>http://theapplegeek.ru/archives/2761</link>
		<comments>http://theapplegeek.ru/archives/2761#comments</comments>
		<pubDate>Tue, 12 Jan 2010 14:34:52 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2761</guid>
		<description><![CDATA[Достаточно давно @andy_shev посоветовал мне уделить внимание переменным окружения, выставляемые при установлении ssh-соединения. Тогда мне это не показалось чем-то важным практически, но сегодня пришло время. Проблема, с которой я столкнулся, оказалась странной. В Snow Leopard наконец-то Terminal.app стал нормально обрабатывать русские буквы в кодировке UTF-8, раньше же были проблемы с их отображением (они или &#8220;бились&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>Достаточно давно <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/andy_shev" >@andy_shev</a></noindex> посоветовал мне уделить внимание переменным окружения, выставляемые при установлении ssh-соединения. Тогда мне это не показалось чем-то важным практически, но сегодня пришло время.</p>
<p>Проблема, с которой я столкнулся, оказалась странной. В Snow Leopard наконец-то Terminal.app стал нормально обрабатывать русские буквы в кодировке UTF-8, раньше же были проблемы с их отображением (они или &#8220;бились&#8221;, или же преобразовывались в набор восьмеричных чисел). Я вздохнул облегчённо &#8211; наконец-то я смог при работе в консоли комфортно писать по-русски.</p>
<p><span id="more-2761"></span></p>
<p>Если же у вас до сих пор есть эта проблема, то прочитайте статью Папаши &#8220;<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.papasha.kiev.ua/2009/11/blog-post.html" >Отбивные из терминала</a></noindex>&#8220;, и у вас всё получится. Правильная конфигурация такая:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/01/02_utf-full.png"  class="image-link" rel="lightbox[2761]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/01/02_utf-thumb.png" height="399" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Но когда я начал переносить свой сайт на второй ноутбук, я работал в основном с ним по ssh, и вот тут-то столкнулся с такой ситуацией &#8211; в локальном Terminal.app русские буквы работают идеально, а вот при заходе на такой же Mac OS X 10.6 по ssh вместо текста получаю набор восьмеричных чисел:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/01/03_utf-full.png"  class="image-link" rel="lightbox[2761]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/01/03_utf-thumb.png" height="331" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>И это при том, что при работе через Screen Sharing с удалённым ноутбуком эта проблема не проявляется:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2010/01/04_utf-full.png"  class="image-link" rel="lightbox[2761]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2010/01/04_utf-thumb.png" height="323" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>&#8220;Хммм&#8230;&#8221;, &#8211; сказал я и многозначительно почесал затылок. В чём же разница? А разница при всех прочих равных условиях (профайлы-то одинаковы) заключается в переменных окружения, которые выставляются при установке соединения по ssh. Идея намечена, проверяю.</p>
<p>Захожу через Screen Sharing, запускаю Terminal.app и сбрасываю переменные окружения в файл:</p>
<pre>
$ set &gt; set.local
</pre>
<p>Захожу туда же через ssh:</p>
<pre>
$ set &gt; set.ssh
</pre>
<p>Сравниваю и нахожу нужную мне переменную:</p>
<pre>
$ diff -u set.ssh set.local
+LC_CTYPE=UTF-8
</pre>
<p>Опять захожу через ssh и пробую выставить её вручную</p>
<pre>
$ export LC_CTYPE=UTF-8
</pre>
<p>Ничего не меняется, значит настройка кодировки производится при запуске bash. Так, за это отвечает библиотека readline, а параметры bash, связанные с ней, можно посмотреть через &#8220;bind -v&#8221;. Повторяю процесс сравнения, в чём же разница:</p>
<pre>
(screen sharing) $ bind -v > bind.local
(ssh) $ bind -v > bind.ssh
$ diff -u bind.ssh bind.local
-set convert-meta on
+set convert-meta off

-set input-meta off
+set input-meta on

-set meta-flag off
+set meta-flag on

-set output-meta off
+set output-meta on
</pre>
<p>Нашёл. Чтобы эти параметры задействовать, их нужно поместить в файл ~/.inputrc и перезпустить bash:</p>
<pre>
$ cat ~/.inputrc
set convert-meta off
set input-meta on
set meta-flag on
set output-meta on
</pre>
<p>После повторного захода получаю именно то, что мне было нужно &#8211; русские буквы набираются без проблем.</p>
<p>Проблема-то решена, но сделаем ещё один шаг. Конфигурации-то одинаковы, почему же переменная LC_TYPE не передаётся через ssh? Смотрю <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ssh.1.html" >man ssh</a></noindex> и в секции ENVIRONMENT нахожу, что при соединении ssh выставляются только такие переменные окружения: DISPLAY, HOME, LOGNAME, MAIL, PATH, SSH_ASKPASS, SSH_AUTH_SOCK, SSH_CONNECTION, SSH_ORIGINAL_COMMAND, SSH_TTY, TZ, USER. И самое ценное:</p>
<blockquote>
<p>Additionally, ssh reads ~/.ssh/environment, and adds lines of the format &#8220;VARNAME=value&#8221; to the envi-ronment environment if the file exists and users are allowed to change their environment.</p>
</blockquote>
<p>Удаляю на удалённом хосте (тавтология) файл ~/.inputrc, делаю файл ~/.ssh/environment и правлю /etc/sshd_config:</p>
<pre>
$ rm ~/.inputrc
$ vim ~/.ssh/environment
LC_CTYPE=UTF-8
$ vim /etc/sshd_config
...
PermitUserEnvironment yes
...
</pre>
<p>Перезапускать sshd не нужно. Захожу по ssh, и вижу, что переменная окружения LC_TYPE выставилась, и русские буквы работают.</p>
<p>Вот такие два метода решения проблемы я нашёл. Каким из них воспользоваться &#8211; выбирать вам. Мне нравится второй, но нужно знать и первый. Только что проделал трюк с PermitUserEnvironment на удалённом хосте с FreeBSD &#8211; и там тоже проблема с русскими буквами исчезла.</p>
<p><b>Update</b>. Спасибо <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/https://twitter.com/lvader" >@Ivader</a></noindex> за подсказку &#8211; более правильно вместо PermitUserEnvironment использовать AcceptEnv:</p>
<pre>
$ vim /etc/sshd_config
AcceptEnv LANG LC_*
</pre>
<p>К сожалению, сейчас не могу попробовать этот рецепт на Mac OS X, но он должен работать.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2761/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Туннелирование SSH</title>
		<link>http://theapplegeek.ru/archives/2285</link>
		<comments>http://theapplegeek.ru/archives/2285#comments</comments>
		<pubDate>Thu, 10 Dec 2009 15:20:58 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Статьи]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=2285</guid>
		<description><![CDATA[Предположим типичную для системного администратора задачу &#8211; есть сервер где-то в глубине сети, на который нужно попасть, предположим, по http, но консольный lynx/elinks не подходит, а нужен именно Safari/Firefox/Chrome (например, сайт на flash или нужна Java). Причём прямого доступа с ноутбука из Интернет на этот сервер нет, но есть &#8220;jumpbox&#8221; (сервер, исключительно через который открыт [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2009/12/01_sshtun1-thumb1.png" height="124" align="right" width="120" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Предположим типичную для системного администратора задачу &#8211; есть сервер где-то в глубине сети, на который нужно попасть, предположим, по http, но консольный lynx/elinks не подходит, а нужен именно Safari/Firefox/Chrome (например, сайт на flash или нужна Java). Причём прямого доступа с ноутбука из Интернет на этот сервер нет, но есть &#8220;jumpbox&#8221; (сервер, исключительно через который открыт доступ по ssh в закрытую сеть). У меня такая ситуация была, когда нужно было попасть на IP-KVM внутри закрытой firewall&#8217;ом сети (я использовал ssl, но здесь для простоты покажу на примере порта 80).</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/12/02_sshtun1-full.png"  class="image-link" rel="lightbox[2285]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/12/02_sshtun1-thumb.png" height="344" width="408" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p><span id="more-2285"></span></p>
<p>Итак, имеем:</p>
<ol>
<li>notebook. Находится в Интернет.</li>
<li>server1 (8.8.8.9). На него разрешён доступ по ssh (желательно использовать технику <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.thoughtcrime.org/software/knockknock/" >port-knocking</a></noindex> для предоставления доступа к ssh только после нескольких запросов на разные порты этого сервера, иначе отбой).</li>
<li>server2 (9.9.9.1). Шлюз сети, но по ssh из Интернет на него попасть нельзя, на него открыт доступ по ssh исключительно с server1. Второй интерфейс сервера смотрит во внутреннюю сети и с него есть доступ на webserver</li>
<li>webserver (10.10.10.2). Доступ на web-сервер есть только из внутренней сети, в частности с server 2</li>
</ol>
<p>Задача: с notebook получить доступ к webserver по http.</p>
<p><b>Шаг 1.</b> На ноутбуке строим ssh-туннель на server1 (конечно же, туннелирование не должно быть запрещено в /etc/sshd_config &#8211; параметр PermitTunnel по умолчанию включен)</p>
<pre>
ssh user_on_server1@8.8.8.9 -L 2000:9.9.9.1:22 -N
</pre>
<p>Начало туннеля на ноутбуке (localhost, порт 2000), конец &#8211; на server2 на порту 22.</p>
<p>-N &#8211; не выполнять команды на удалённом хосте, полезно для туннелирования.</p>
<p><b>Шаг 2.</b> Строим второй туннель поверх первого туннеля на webserver. Заметьте, что при соединии на порт 2000 на localhost соединение пробрасывается на 9.9.9.1 порт 22 (server2, и нужно вводить пароль пользователя именно на server2):</p>
<pre>
ssh -p 2000 user_on_server2@localhost -L 80:10.10.10.2:80 -N
</pre>
<p>Учтите, что web-sharing на ноутбуке должен быть отключен, иначе соединение не установится. Если же отключить его нельзя, то можно перекинуть на другой порт начало туннеля.<br />
Получили туннель с началом на localhost, порт 80, и концом &#8211; на порту 80 webserver&#8217;а.</p>
<p><b>Шаг 3.</b> Запускаем браузер и указываем http://127.0.0.1. Поверх двух туннелей заходим через Интернет на web-сервер во внутренней сети.</p>
<p>Если на web-сервере явно прописано имя сайта, как в wordpress (например, www.site.com), то первый же линк сайта уведёт с localhost на www.site.com. Если такое случилось, то делаем трюк, явно пишем в /etc/hosts:</p>
<pre>
127.0.0.1	www.site.com
</pre>
<p>Главное потом убрать эту строку, когда понадобится прямой доступ.</p>
<p>Туннелирование очень мощный инструмент, но с первого раза просто запутаться. Пару экспериментов &#8211; и всё станет понятно. Конфигурацию с web-сервером я привёл для примера. Точно так же можно организовать проброс для соединения с сервером Windows по RDC, на VPN SSL-сервер и т.п.</p>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/2285/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Аутентификация по публичным ключам с использованием ssh-agent</title>
		<link>http://theapplegeek.ru/archives/1354</link>
		<comments>http://theapplegeek.ru/archives/1354#comments</comments>
		<pubDate>Fri, 23 Oct 2009 15:53:38 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Quick Tips]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1354</guid>
		<description><![CDATA[Как я сказал ранее, к аутентификации по публичным ключам нужно подходить ответственно. Ставить пустой passphrase грозит компрометацией ваших удалённых хостов. А каждый раз вводить passphrase не всегда возможно. Для того, чтобы достигнуть разумного компромиса, используется ssh-agent. Это программа, хранящая приватные ключи, используемые для аутентификации по публичным ключам RSA/DSA. Генерируем ключ (для простоты я предварительно удалил [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://theapplegeek.ru/wp-content/uploads/2009/10/01_ssh-agent-thumb1.png" height="50" align="right" width="150" style=" display: inline; float: right; margin: 0 0 10px 10px;" /></p>
<p>Как я <a href="http://theapplegeek.ru/archives/1345" >сказал ранее</a>, к аутентификации по публичным ключам нужно подходить ответственно. Ставить пустой passphrase грозит компрометацией ваших удалённых хостов. А каждый раз вводить passphrase не всегда возможно. Для того, чтобы достигнуть разумного компромиса, используется <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/ssh-agent.1.html" >ssh-agent</a></noindex>. Это программа, хранящая приватные ключи, используемые для аутентификации по публичным ключам RSA/DSA.</p>
<p><span id="more-1354"></span></p>
<p>Генерируем ключ (для простоты я предварительно удалил все ключи, так как некоторые были без passphrase). Будем использовать DSA, любители RSA могут посмотреть разницу в <a href="http://theapplegeek.ru/archives/1345" >предыдущей статье</a>. Обязательно указываем хорошую passphrase:</p>
<pre>
$ <b>ssh-keygen -t dsa</b>
<small>Generating public/private dsa key pair.
Enter file in which to save the key (/Users/ctrld/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/ctrld/.ssh/id_dsa.
Your public key has been saved in /Users/ctrld/.ssh/id_dsa.pub.
The key fingerprint is:
12:1b:02:27:8b:70:44:0b:2c:3f:9c:4b:d0:ef:d9:5e ctrld@129-149-179-94.pool.ukrtel.net
The key's randomart image is:
+--[ DSA 1024]----+
|++* .            |
|+=.*             |
|o+oo. o          |
|  * .. +         |
| . + oo S        |
|  . o ..E        |
|     . .         |
|      .          |
|                 |
+-----------------+</small>
</pre>
<p>Делаем по аналогии <a href="http://theapplegeek.ru/archives/1345" >с предыдущей статьёй</a>.</p>
<p>Копируем ключ</p>
<pre>
$ <b>cat ~/.ssh/id_dsa.pub</b>
<small>ssh-dss AAAAB3...60QnQ== ctrld@hostname.local</small>
</pre>
<p>Идём на удалённую машину и записываем этот публичный ключ в ~/.ssh/authorized_keys2 (желательно удалить из него ваши старые ключи):</p>
<pre>
$ <b>vi ~/.ssh/authorized_keys2</b>
$ <b>chmod 600 ~/.ssh/authorized_keys2</b>
</pre>
<p>Выходим, проверяем работу. А вот теперь удивляемся :-) ssh-agent и так запущен на Mac OS X, и мы получаем окошко, в котором вводим ключ, причём его можно запомнить в keychain:</p>
<p style="clear: both"><a href="http://theapplegeek.ru/wp-content/uploads/2009/10/02_ssh-agent-full.png"  class="image-link" rel="lightbox[1354]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/10/02_ssh-agent-thumb.png" height="259" width="443" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Теперь, несмотря на то, что ваш ключ использует passphrase, она не будет запрашиваться. Я не могу сейчас ответить, сколько именно времени он не будет запрашиваться.</p>
<p>Если же вы уходите, но по какой-то причине даёте поработать кому-то на вашем Маке, да ещё под вашим account&#8217;ом (ладно, пример неудачный, этот кто-то может попытаться посмотреть ваш keychain, и если он не запаролен, то узнает ваш ключ), то можете заблокировать доступ к ssh-agent, и при попытке соединения будет снова запрашиваться passphrase.</p>
<p>Блокировка (нужно указать любой пароль):</p>
<pre>
$ <b>ssh-add -x</b>
<small>Enter lock password:
Again:
Agent locked.</small>
</pre>
<p>Разблокировка (с запросом установленного пароля)</p>
<pre>
$ <b>ssh-add -X</b>
<small>Enter lock password:
Agent unlocked.</small>
</pre>
<p>Если вдруг ssh-agent не запущен, то его можно запустить самому (детальнее &#8211; в &#8220;<noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.securityfocus.com/infocus/1812" >SSH and ssh-agent</a></noindex>&#8220;):</p>
<pre>
$ <b>eval `ssh-agent`</b>
</pre>
<p>Перечень всех добавленных ключей:</p>
<pre>
$ <b>ssh-add -l</b>
<small>1024 12:1b:02:27:8b:70:44:0b:2c:3f:9c:4b:d0:ef:d9:5e /Users/ctrld/.ssh/id_dsa (DSA)</small>
</pre>
<p>Ручное добавление ключей из ~/.ssh:</p>
<pre>
$ <b>ssh-add</b>
<small>Enter passphrase for /Users/ctrld/.ssh/id_dsa:
Identity added: /Users/ctrld/.ssh/id_dsa (/Users/ctrld/.ssh/id_dsa)</small>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1354/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Аутентификация по публичному ключу в SSH</title>
		<link>http://theapplegeek.ru/archives/1345</link>
		<comments>http://theapplegeek.ru/archives/1345#comments</comments>
		<pubDate>Fri, 23 Oct 2009 15:13:08 +0000</pubDate>
		<dc:creator>ctrld</dc:creator>
				<category><![CDATA[Quick Tips]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://theapplegeek.ru/?p=1345</guid>
		<description><![CDATA[Если вы часто заходите на внешние сервера по SSH, или же у вас запускаются процессы, требующие сделать что-то на удалённом сервере, то вместо постоянного ввода пароля можно настроить аутентификацию в SSH по публичным ключам. К этому нужно подходить с умом и осторожностью &#8211; если у вас украдут ключи из каталога ~/.ssh, и у вас не [...]]]></description>
			<content:encoded><![CDATA[<p>Если вы часто заходите на внешние сервера по SSH, или же у вас запускаются процессы, требующие сделать что-то на удалённом сервере, то вместо постоянного ввода пароля можно настроить аутентификацию в SSH по публичным ключам. К этому нужно подходить с умом и осторожностью &#8211; если у вас украдут ключи из каталога ~/.ssh, и у вас не настроен passphrase, то злоумышленники получат доступ ко всем вашим серверам. Лучший метод &#8211; установка passphrase во время генерации ключа или использование ssh-agent.</p>
<p><a href="http://theapplegeek.ru/wp-content/uploads/2009/10/01_sshpublic-full.png"  class="image-link" rel="lightbox[1345]"><img class="linked-to-original" src="http://theapplegeek.ru/wp-content/uploads/2009/10/01_sshpublic-thumb.png" height="165" width="500" style=" text-align: center; display: block; margin: 0 auto 10px;" /></a></p>
<p>Давайте рассмотрим, как настроить аутентификацию.</p>
<p><span id="more-1345"></span></p>
<h2>Действия на локальном компьютере</h2>
<p>Ключи находятся в каталоге ~/.ssh:</p>
<pre>
$ <b>ls -al ~/.ssh/</b>
<small>total 32
drwx------   6 ctrld  staff   204 Oct 23 17:39 .
drwxr-xr-x+ 40 ctrld  staff  1360 Oct 22 21:01 ..
-rw-r--r--   1 ctrld  staff    78 Sep 26 20:02 config
-rw-------   1 ctrld  staff   668 Oct 23 17:39 id_dsa
-rw-r--r--   1 ctrld  staff   626 Oct 23 17:39 id_dsa.pub
-rw-r--r--   1 ctrld  staff  2410 Oct 13 11:44 known_hosts</small>
</pre>
<p>Если каталог .ssh отсутствует, то достаточно попытаться зайти куда-нибудь по ssh. Если файлов id_dsa.* (я использую DSA, но можно и RSA) нет, то их нужно сгенерировать. Во время генерации ssh-keygen спросит passphrase (можно просто нажать Enter и она при входе не будет спрашиваться).</p>
<pre>
$ <b>ssh-keygen -t dsa</b>
<small>Generating public/private dsa key pair.
Enter file in which to save the key (/Users/ctrld/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/ctrld/.ssh/id_dsa.
Your public key has been saved in /Users/ctrld/.ssh/id_dsa.pub.
The key fingerprint is:
e3:9a:18:f0:4c:6e:3e:44:8f:d3:a3:cc:c2:db:e0:b5 ctrld@129-149-179-94.pool.ukrtel.net
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|                 |
|                 |
|    .            |
|  ...+  S        |
|   *+ +. .       |
| ..+Bo ..        |
| .o*=+ o         |
|  ooE.o          |
+-----------------+</small>
</pre>
<p>Если вы предпочитаете RSA, то:</p>
<pre>
$ <b>ssh-keygen -t rsa</b>
</pre>
<p>Копируем строку с публичным ключом &#8211; он нам понадобится на удалённом компьютере (remote, а не removed :)</p>
<pre>
$ <b>cat ~/.ssh/id_dsa.pub</b>
ssh-dss AAAAB3............Pbec= ctrld@hostname.local
</pre>
<p>Для RSA:</p>
<pre>
$ <b>cat ~/.ssh/id_rsa.pub</b>
ssh-rsa AAAAB3............IJAw== ctrld@hostname.local
</pre>
<h2>Действия на удалённом компьютере</h2>
<p>Конечно же, на удалённом сервере должен быть запущен SSH-сервер. Обычно это OpenSSH, но встречаются и недобитые динозавры с коммерческими SSH-серверами (это вызывает моё искреннее удивление &#8211; да, есть и такое).</p>
<p>Заходим на удалённый сервер:</p>
<pre>
$ <b>ssh ctrld@remote.net</b>
</pre>
<p>Проверяем, есть ли каталог .ssh:</p>
<pre>
$ <b>ls -al ~/.ssh</b>
</pre>
<p>Если его нет, то делаем простой трюк &#8211; &#8220;ssh ctrld@localhost&#8221;, и .ssh создаётся автоматически.</p>
<p>Редактируем файл с публичными ключами, и добавляем соответствующий скопированный ключ.</p>
<p>Для DSA (authorized_keys2):</p>
<pre>
$ <b>vi ~/.ssh/authorized_keys2</b>
</pre>
<p>Вариант:</p>
<pre>
$ <b>echo "ssh-dss AAAAB3............Pbec= ctrld@hostname.local" >> ~/.ssh/authorized_keys2</b>
</pre>
<p>Для RSA (authorized_keys):</p>
<pre>
$ <b>vi ~/.ssh/authorized_keys</b>
</pre>
<p>Сохраняем файл, и (!) обязательно меняем права доступа на 0600, иначе файл публичных ключей не будет восприниматься:</p>
<pre>
$ <b>chmod 600 ~/.ssh/authorized_keys*</b>
</pre>
<p>Выходим с удалённого компьютера и пытаемся зайти на него снова по ssh. Если всё было сделано правильно, то будет запрошен passphrase, а если он был пустой, то будет произведён вход без запроса.</p>
<h2>Альтернатива &#8211; скрипт ssh-copy-id</h2>
<p><noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/andy_shev" >@andy_shev</a></noindex> и <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/akaDimiG" >@akaDimiG</a></noindex> порекомендовали гораздо более простой вариант &#8211; использовать скрипт ssh-copy-id (по домену вижу, что это разработчики Putty, поэтому доверять можно). Но его первый недостаток в том, что он не входит в штатную поставку Mac OS X. Списать скрипт можно <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://devthought.com/tumble/2009/09/get-ssh-copy-id-in-mac-os-x/" >по простому рецепту</a></noindex>:</p>
<pre>
sudo curl "http://www.chiark.greenend.org.uk/ucgi/~cjwatson/cvsweb/openssh/contrib/ssh-copy-id?rev=1.8;content-type=text%2Fplain" -o /usr/bin/ssh-copy-id
sudo chmod +x /usr/bin/ssh-copy-id
</pre>
<p>Второй недостаток &#8211; для использования нестандартных портов ssh скрипт нужно модифицировать. Третий &#8211; он использует ключи RSA, я же &#8211; DSA. Но если вас эти недостатки не смущают, то скрипт можно вполне использовать. Я же буду пользоваться описанным выше методом :-)</p>
<p>А вот <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://www.macosxhints.com/article.php?story=2007091814022049" >скрипт с MacOSXHints</a></noindex>, который мне понравился гораздо больше (спасибо за ссылку <noindex><a rel="nofollow" href="http://theapplegeek.ru/goto/http://twitter.com/akaDimiG" >@akaDimiG</a></noindex>):</p>
<pre>
#!/bin/sh

KEY="$HOME/.ssh/id_dsa.pub"

if [ ! -f ~/.ssh/id_dsa.pub ];then
    echo "private key not found at $KEY"
    echo "* please create it with "ssh-keygen -t dsa" *"
    echo "* to login to the remote host without a password, don't give the key you create with ssh-keygen a password! *"
    exit
fi

if [ -z $1 ];then
    echo "Please specify user@host.tld as the first switch to this script"
    exit
fi

echo "Putting your key on $1... "

KEYCODE=`cat $KEY`
ssh -q $1 "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "$KEYCODE" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"

echo "done!"
</pre>
]]></content:encoded>
			<wfw:commentRss>http://theapplegeek.ru/archives/1345/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached (user agent is rejected)
Page Caching using memcached (user agent is rejected)
Database Caching 9/46 queries in 0.927 seconds using memcached
Object Caching 652/699 objects using memcached

Served from: theapplegeek.ru @ 2010-07-31 03:08:23 -->