Журнал LinuxFormat - перейти на главную

LXF165-166: Безо­пас­ность: SSH

Материал из Linuxformat
Перейти к: навигация, поиск

Се­ти: По­лу­чи­те дос­туп к сво­ему ком­пь­ю­те­ру из лю­бой точ­ки ми­ра

Содержание

SSH: Связь без опа­сений

Нейл Бот­вик по­ка­зы­ва­ет, как с по­мо­щью SSH два ком­пь­ю­те­ра мо­гут об­щать­ся друг с дру­гом мак­си­маль­но удоб­но и безо­пас­но.

Bothwick opt.png

Про SSH, или «за­щи­щен­ную обо­лоч­ку [Secure Shell]», слы­ша­ли мно­гие из нас, но она уме­ет не толь­ко от­кры­вать се­анс тер­ми­на­ла на дру­гом ком­пь­ю­те­ре. Тем, кто не зна­ком с SSH, бу­дет ин­те­рес­но уз­нать, что с ее по­мо­щью мож­но от­крыть за­щи­щен­ный се­анс тер­ми­на­ла че­рез сеть. Весь тра­фик, вклю­чая об­мен па­ро­ля­ми, шиф­ру­ет­ся, что по­зво­ля­ет ис­поль­зо­вать неза­щи­щен­ные ка­на­лы. Обыч­но SSH за­пуска­ет­ся так:

ssh user@hostname

Ко­ман­да под­клю­чит­ся к уда­лен­но­му хосту и за­про­сит па­роль поль­зо­ва­те­ля, а за­тем от­кро­ет обо­лоч­ку по умол­чанию для это­го поль­зо­ва­те­ля. Часть ад­ре­са user@ мож­но опустить, и тогда SSH восполь­зу­ет­ся те­ку­щим именем поль­зо­ва­те­ля, но при­дет­ся ука­зать па­роль; при этом бу­дут ис­поль­зо­ва­ны на­строй­ки по умол­чанию для это­го поль­зо­ва­те­ля на уда­лен­ном ком­пь­ю­те­ре.

Ис­поль­зо­вать па­ро­ли для вхо­да и неудоб­но, и нена­деж­но; и чем на­дежнее па­роль, тем это менее удоб­но. SSH име­ет и аль­тер­на­ти­ву – ау­тен­ти­фи­ка­цию по клю­чам, по­зво­ляю­щую поль­зо­ва­те­лю вой­ти в сис­те­му на дру­гом ком­пь­ю­те­ре от сво­его имени без вво­да па­ро­ля. По­это­му не поль­зуй­тесь ею на уст­рой­ст­вах, ко­то­рые лег­ко по­те­рять или ук­расть, на­при­мер, на смарт­фо­нах. Соз­дать клю­чи на локаль­ном ком­пь­ю­те­ре мож­но ко­ман­дой:

ssh-keygen -t edcsa

Па­ра­метр -t за­да­ет тип клю­ча: rsa, dsa или edcsa. По­следний ис­поль­зу­ет­ся по умол­чанию в бо­лее но­вых вер­си­ях SSH, но не под­дер­жи­ва­ет­ся в бо­лее ста­рых ре­ли­зах, по­это­му вы мо­же­те вы­брать dsa. От­веть­те на во­про­сы, и ко­ман­да соз­даст па­ру клю­чей в ка­та­ло­ге ~/.ssh; фай­лы бу­дут на­зва­ны в со­от­вет­ст­вии с ти­пом, на­при­мер, id_ecdsa and id_ecdsa.pub. По­следний файл – пуб­лич­ный ключ, ко­то­рый ко­пи­ру­ет­ся на уда­лен­ный ком­пь­ю­тер, дру­гой файл – при­ват­ный ключ, и им не сле­ду­ет де­лить­ся ни с кем. Ско­пи­руй­те пуб­лич­ный ключ на уда­лен­ный ком­пь­ю­тер ко­ман­дой

ssh-copy-id -i ~/.ssh/id_edcsa.pub user@hostname

Ко­ман­да за­про­сит у вас па­роль на уда­лен­ном ком­пь­ю­те­ре и за­тем ско­пи­ру­ет ту­да пуб­лич­ный ключ. При сле­дую­щей по­пыт­ке под­клю­чить­ся к это­му ком­пь­ю­те­ру под данным поль­зо­ва­те­лем вы вой­де­те в сис­те­му без за­про­са па­ро­ля.

Для по­вы­шения безо­пас­но­сти мож­но от­клю­чить вход по па­ро­лям, и тогда в сис­те­му смо­гут вой­ти толь­ко поль­зо­ва­те­ли с за­ре­ги­ст­ри­ро­ван­ны­ми клю­ча­ми. Тогда вам по­на­до­бит­ся доступ root или sudo на це­ле­вом ком­пь­ю­те­ре – при­дет­ся из­менить файл /etc/ssh/sshd_config. Най­ди­те стро­ку с па­ра­мет­ром

PasswordAuthentication yes

и из­мените его на no. Пе­ре­за­пусти­те де­мо­на SSH, и к ком­пь­ю­те­ру смо­гут под­клю­чить­ся толь­ко поль­зо­ва­те­ли с клю­ча­ми. Сде­лать то же са­мое для поль­зо­ва­те­ля root мож­но, ука­зав па­ра­мет­ры

PermitRootLogin no

PermitRootLogin without-password

Вход с па­ро­лем для root нуж­но от­клю­чать всегда; это са­мый неза­щи­щен­ный вход, по­то­му что root – един­ст­вен­ный поль­зо­ва­тель, имя ко­то­ро­го из­вест­но за­ранее.

За­пуск про­грамм

C SSH мож­но не толь­ко от­крыть се­анс тер­ми­на­ла; мож­но, ска­жем, за­пускать про­грам­мы на­пря­мую. Ко­ман­да

ssh user@computer someprogram --arguments

за­хо­дит в сис­те­му на уда­лен­ном ком­пь­ю­те­ре, за­пуска­ет ука­зан­ную про­грам­му и за­вер­ша­ет­ся. Обо­лоч­ка не от­кры­ва­ет­ся, и весь вы­вод ото­бра­жа­ет­ся на локаль­ном тер­ми­на­ле. Будь­те внима­тель­ны со спе­ци­аль­ны­ми сим­во­ла­ми и ка­выч­ка­ми, по­то­му что пе­ред пе­ре­да­чей ssh ко­ман­ды бу­дут об­ра­бо­та­ны локаль­ной обо­лоч­кой. Так, ко­ман­да

ssh myothercomputer ls *.jpg

не сде­ла­ет то­го, че­го вы ожи­да­ли, по­сколь­ку локаль­ная обо­лоч­ка пре­об­ра­зу­ет *.jpg в спи­сок всех фай­лов с этим рас­ши­рением в те­ку­щем ка­та­ло­ге и за­тем пе­ре­даст ssh, ко­то­рая вернет мно­же­ст­во оши­бок «Та­ко­го фай­ла не су­ще­ст­ву­ет». Что­бы спе­ци­аль­ные сим­во­лы бы­ли пе­ре­да­ны без ин­тер­пре­та­ции, нуж­но их эк­раниро­вать или брать в ка­выч­ки.

ssh myothercomputer ls \*.jpg

С по­мо­щью SSH мож­но за­пускать не толь­ко ко­ман­ды в тер­ми­на­ле, но и гра­фи­че­­ские про­грам­мы. Сна­ча­ла убе­ди­тесь, что в /etc/ssh/sshd_config есть стро­ка

X11Forwarding yes

За­тем вы­зо­ви­те ssh с па­ра­мет­ром -X или -Y. У -X есть до­полнитель­ные ог­раничения по безо­пас­но­сти, по­это­му поль­зуй­тесь -Y толь­ко когда -X не де­ла­ет то­го, что вам нуж­но, и толь­ко в за­щи­щен­ной се­ти.

ssh -X myothercomputer

С по­мо­щью SSH мож­но под­клю­чить­ся к ком­пь­ю­те­ру из лю­бой точ­ки ми­ра, ес­ли в мар­шру­ти­за­то­ре на­строе­но пе­ре­на­прав­ление под­клю­чений на порт 22 (стан­дарт­ный порт SSH). Это де­ла­ет его ла­ко­мой це­лью атак юных ха­ке­ров, и ваш сис­тем­ный жур­нал мо­жет быть по­лон неудач­ных по­пы­ток вхо­да в сис­те­му. Хо­тя ау­тен­ти­фи­ка­ция по клю­чу пре­дот­вра­тит успех та­ких атак, ваш ком­пь­ю­тер все рав­но дол­жен с ними бо­роть­ся. По­пу­ляр­ное ре­шение – восполь­зо­вать­ся нестан­дарт­ным пор­том. Ес­ли ваш марш­­ру­ти­за­тор мо­жет пе­ре­на­прав­лять тра­фик с од­но­го вхо­дя­ще­го пор­та на дру­гой, это про­сто: вы­бе­ри­те лю­бой, но неис­поль­зуе­мый порт с боль­шим но­ме­ром, пе­ре­на­правь­те его на порт 22, и локаль­ный доступ бу­дет ра­бо­тать так же, как пре­ж­де. Про­сто помните, что вне мар­шру­ти­за­то­ра нуж­но ука­зы­вать дру­гой но­мер пор­та, а так­же внешний IP-ад­рес или имя хоста ком­пь­ю­те­ра.

ssh -p 5678 user@public.ip

Ес­ли мар­шру­ти­за­тор мо­жет пе­ре­на­прав­лять толь­ко на тот же порт, мож­но за­ста­вить SSH слу­шать оба пор­та, и порт 22 бу­дет по-прежнему ра­бо­тать локаль­но – для это­го до­бавь­те сле­дую­щие стро­ки в sshd_config:

Port 22

Port 5678

Те­перь про­сто за­помните, что при под­клю­чении из­вне нуж­но ука­зы­вать но­вый порт. Ес­ли вам лень за­по­ми­нать, мож­но до­ба­вить сле­дую­щие стро­ки в ~/.ssh/ssh_config:

Host <имя хос­та или ад­рес IP>

Port 5678

Лю­бой па­ра­метр, ука­зан­ный по­сле стро­ки Host, при­ме­ня­ет­ся толь­ко к со­от­вет­ст­вую­щим хостам. При­ме­нять­ся бу­дут все па­ра­мет­ры до сле­дую­щей стро­ки Host, так что пе­ред лю­бы­ми гло­баль­ны­ми на­строй­ка­ми ставь­те стро­ку Host *. Ка­ж­дый па­ра­метр мож­но за­да­вать толь­ко один раз, по­это­му на­строй­ки для кон­крет­ных хостов в этом фай­ле долж­ны ид­ти пе­ред на­строй­ка­ми по умол­чанию. Эти на­строй­ки при­ме­ня­ют­ся толь­ко к те­ку­ще­му локаль­но­му поль­зо­ва­те­лю. Что­бы они при­ме­ня­лись ко всем поль­зо­ва­те­лям, восполь­зуй­тесь фай­лом /etc/ssh_config.

Чер­ные спи­ски

Еще один спо­соб борь­бы с неже­ла­тель­ны­ми по­пыт­ка­ми вхо­да по SSH, осо­бен­но ес­ли вы не мо­же­те по­ме­нять порт – ав­то­ма­ти­че­­ская бло­ки­ров­ка IP-ад­ре­сов, по­пыт­ки вхо­да с ко­то­рых по­сто­ян­но за­вер­ша­ют­ся неудач­но. Су­ще­ст­ву­ет несколь­ко про­грамм, ко­то­рые это де­ла­ют, од­на из са­мых по­пу­ляр­ных – fail2ban (www.fail2ban.org). Эта про­грам­ма, как и ее ана­ло­ги, сканиру­ет лог-фай­лы на на­ли­чие при­зна­ков по­доз­ри­тель­ной ак­тив­но­сти. Для SSH это мно­же­ст­вен­ные по­пыт­ки под­клю­чения с раз­ны­ми име­на­ми поль­зо­ва­те­ля с од­но­го и то­го же IP-ад­ре­са. При об­на­ру­жении по­до­з­ри­тель­но­го по­ве­дения она соз­да­ет пра­ви­ло бранд­мау­эра, ко­то­рое бло­ки­ру­ет все под­клю­чения с это­го ад­ре­са на за­дан­ный пе­ри­од вре­мени. Мож­но на­стро­ить и дру­гие дей­ст­вия, на­при­мер, от­прав­ку пись­ма, но бло­ки­ро­вание на уровне бранд­мау­эра ис­поль­зу­ет­ся по умол­чанию. На­строй­ки по умол­чанию ох­ва­ты­ва­ют по­пу­ляр­ные сер­ве­ры, в том чис­ле SSH, а так­же web-сер­вер Apache. Боль­шин­ст­ву поль­зо­ва­те­лей доста­точ­но уста­но­вить про­грам­му из менед­же­ра па­ке­тов и убе­дить­ся, что сер­вис за­пуска­ет­ся при за­груз­ке сис­те­мы. Так­же мож­но уста­но­вить про­грам­му вро­де Logwatch (www.logwatch.org), ко­то­рая про­смат­ри­ва­ет фай­лы жур­на­лов и еже­днев­но от­прав­ля­ет сум­мар­ный от­чет обо всей сис­тем­ной ак­тив­но­сти.

Про­грам­ма, на ко­то­рую сто­ит об­ра­тить внимание всем поль­зо­ва­те­лям SSH – screen (www.gnu.org/software/screen). Ес­ли вы за­пускае­те про­грам­му в уда­лен­ной обо­лоч­ке и се­те­вое со­единение раз­ры­ва­ет­ся, обо­лоч­ка за­вер­шит­ся со все­ми про­грам­ма­ми, ко­то­рые бы­ли в ней за­пу­ще­ны. Screen на­зы­ва­ют муль­ти­п­лек­со­ром тер­ми­на­лов, т. е. вы за­пускае­те его в обо­лоч­ке, и на пер­вый взгляд ниче­го не ме­ня­ет­ся, но те­перь вы на­хо­ди­тесь в сес­сии screen. За­пусти­те про­грам­му и на­жми­те Ctrl + A, за­тем D, и сес­сия тер­ми­на­ла ис­чезнет. Вы­полните ко­ман­ду

screen -r

и сес­сия тер­ми­на­ла поя­вит­ся сно­ва с за­пу­щен­ной в ней про­грам­мой, как буд­то нику­да не ис­че­за­ла. Это осо­бен­но удоб­но с SSH, по­то­му что мож­но вой­ти в сис­те­му, за­пустить screen и вы­пол­нять все необ­хо­ди­мые дей­ст­вия. Ес­ли под­клю­чение SSH бу­дет пре­рвано, мож­но пе­ре­под­клю­чить­ся и вы­полнить ко­ман­ду screen -r. Это да­же не обя­за­тель­но де­лать с то­го же са­мо­го ком­пь­ю­те­ра.

Тол­па SSH

Обыч­но с по­мо­щью SSH мы под­клю­ча­ем­ся с од­но­го ком­пь­ю­те­ра к дру­го­му, но что ес­ли нуж­но за­пустить ко­ман­ду на несколь­ких ком­пь­ю­те­рах се­ти? Сде­лать это мож­но с dsh (www.netfort.gr.jp/~dancer/software/dsh.html.en), раз­но­вид­но­стью рас­пре­де­лен­ной обо­лоч­ки. Ос­нов­ной фор­мат ко­ман­ды та­ков:

dsh -m user1@host1 -m user2@host2 command

Хостов мож­но ука­зать лю­бое ко­ли­че­­ст­во. С dsh вам ох как при­го­дит­ся ау­тен­ти­фи­ка­ция с по­мо­щью клю­чей, ина­че при­дет­ся на­би­рать ог­ром­ное ко­ли­че­­ст­во па­ро­лей. Что­бы ка­ж­дый раз не на­би­рать име­на хостов, мож­но до­ба­вить их в груп­пу в фай­ле в ка­та­ло­ге /etc/dsh/groups/:

user1@host1

user2@host2

host3

Для по­следнего хоста ра­бо­та­ет обыч­ное пра­ви­ло SSH, при ко­то­ром ис­поль­зу­ет­ся те­ку­щее имя поль­зо­ва­те­ля, ес­ли оно не ука­за­но. За­пусти­те dsh сле­дую­щим об­ра­зом:

dsh -g groupname command

Здесь groupname – имя фай­ла в /etc/dsh/groups; толь­ко имя, а не пол­ный путь. Так­же в фай­ле /etc/dsh/machines.list мож­но за­дать груп­пу по умол­чанию, а за­тем за­пустить ту же ко­ман­ду для всех хостов этой груп­пы:

dsh -a command

Обыч­но ко­ман­да за­пуска­ет­ся на всех ком­пь­ю­те­рах од­но­вре­мен­но. Это са­мый бы­ст­рый спо­соб, но он не слиш­ком хо­рош, ес­ли ко­ман­ды генери­ру­ют боль­шой объ­ем вы­ход­ных дан­ных.

В на­ча­ле ка­ж­дой стро­ки ука­зы­ва­ет­ся имя ком­пь­ю­те­ра, на ко­то­ром за­пу­ще­на ко­ман­да, но ес­ли вы­во­ди­мых строк мно­го, то здесь лег­ко за­пу­тать­ся. В этом слу­чае ука­жи­те па­ра­метр -w, что­бы dsh ожи­да­ла за­вер­шения ко­ман­ды на ка­ж­дом ком­пь­ю­те­ре и толь­ко по­том за­пуска­ла ее на сле­дую­щем. Этот и дру­гие па­ра­мет­ры мож­но за­дать как ис­поль­зуе­мые по умол­чанию в /etc/dsh/dsh.conf. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика