LINUX.ORG.RU

ssh-proxy: как дать человеку доступ на сервер, не давая ему приватный ключ

 , , ,


0

3

https://github.com/flussonic/ssh-proxy

Есть сотрудник, который может уволиться с работы. Есть сервера, принадлежащие нашим клиентам, на которые ему надо организовать доступ по ssh.

Как пустить сотрудника на сервер так, что бы потом можно было отозвать доступ и больше не пускать?

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

Мы решили попробовать сделать ssh-proxy, организованный на подобие гитозиса: публичные ключи сотрудников лежат в папке, приватный лежит на сервере.

Можно залогиниться как ssh root/clientserver@sshproxy.company.com и тогда сразу попадешь на root@clientserver

Сейчас реализовано: 1) авторизация сотрудников по публичным ключам 2) проксирование текстовых команд

Не реализовано:

1) разграничение прав, кому куда ходить можно и не можно 2) тунеллирование, scp, sftp. Этого вообще нет из коробки в эрланге, надо будет допиливать ему stdlib 3) ещё кучи чего наверное

Будет ли это полезно и интересно кому-нибудь ещё?

★★★★★

Последнее исправление: max_lapshin (всего исправлений: 2)
Ответ на: комментарий от max_lapshin

Вот не вижу, чтобы это сообщение как-то опровергало моё. Какие-то ортогональные замечания.

громче всех про язык написания софта орут те, кто никогда в жизни ни единого патча не делал, так что это не страшно.

Я не зря написал про скрипт вида «сделай сам». Если ты собираешься оформлять в виде коробочного решения, без разницы, на чём оно там будет написано, пока его можно поставить, включить и пользоваться. А вот если это набор скриптов, которые надо ещё как-то настраивать и подгонять, язык важен. Насколько вероятнее у некоторого случайного девопса наличие навыков кодинга на Erlang? А на Python или Perl?

i-rinat ★★★★★
()
Ответ на: комментарий от max_lapshin

А ты тяжелый человек. Твои желания, твои проблемы. Я выдал столько информации, сколько смог или захотел. Сам думай, что с ней делать.

anonymous
()
Ответ на: комментарий от Stanson

поясню ещё раз, надеюсь получится:

1) есть проблемы в том, что бы на те сервера положить все наши публичные ключи: 1.1 админам тех серверов может не понравиться много наших ключей 1.2 админы тех серверов могут стереть ключи 1.3 админы тех серверов могут генерировать свои authorized_keys и тогда надо встраиваться в их механизацию управления этим параметром (думаю, ты догадываешься насколько это сложно) 1.4 мы можем задолбать админов тех серверов: добавьте/уберите ключ, если для этого надо дергать их

2) мы не можем иметь полный достоверный список чужих серверов. Их могут выключить, потом обратно включить, поменять адрес, хостнейм

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от Deleted

как я уже говорил, вопрос ещё глубже: а если он положил руткит? Очень грустно и плохо. Но это никак не влияет на то: выбрать ssh-proxy или бегать каждый раз к какой-то мифической СБ и писать бумажные заявления на добавление публичного ключа.

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

мы в целом всё стараемся оформлять коробочным решением, что бы потом самим не надо было мучительно вспоминать: как же разворачивать эту штуку, которую два года не трогали.

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от max_lapshin

а если он положил руткит?

Ну так и прокся от этого не защитит. Ну разве что в нее IDS встроить. Так что только анально огараживать сервера, ставя везде rkhunter, и логируя все команды на удаленный сервер, и т.д. и т.п.

Deleted
()
Ответ на: комментарий от Deleted

А если «плохой» сотрудник засунул туда еще пару своих ключей заранее?

Отфильтруй их.

Или, как вариант, хранить единый официальный authorized_keys в конторе под замком, а при изменениях (удалении сотрудника) просто копировать его на 100500 серверов. Все левые ключи будут просто затёрты официальным authorized_keys.

Stanson ★★★★★
()
Ответ на: комментарий от max_lapshin

Теперь вижу проблему:

админы тех серверов

Технически эта проблема нерешаема в принципе. «Админы тех серверов» могут восстановить ключ уволенного сотрудника из бэкапа, или просто дать ему пароль, например. А вашу контору послать нафиг и платить за суппорт уволенному сотруднику.

мы не можем иметь полный достоверный список чужих серверов. Их могут выключить, потом обратно включить, поменять адрес, хостнейм

Опять непонятно. Вы хотите без ведома владельца сервера что-то там делать, что-ли? Причём даже если владелец поменял адрес и хостнейм? Насколько я понимаю, если владельцу сервера понадобится ваше вмешательство, то он как минимум сообщит вам об изменениях IP и хостнейма.

Stanson ★★★★★
()
Ответ на: комментарий от max_lapshin

будет известно, на какие сервера он в принципе заходил.

Ты недооцениваешь изобретательность злонамеренных персонажей.

i-rinat ★★★★★
()
Ответ на: комментарий от max_lapshin

И это конечно же, безусловно, не в больших конторах, а в средних и небольших такое можно сделать. В большой конторе невозможно даже составить список существующих серверов, уже не говоря о том, что бы их завести под один ldap.

Яндекс, наверное, небольшая контора.

ivlad ★★★★★
()
Ответ на: комментарий от stevejobs

ansible поддерживает bastion-host

https://docs.ansible.com/ansible/latest/faq.html#how-do-i-configure-a-jump-ho...

когда у тебя контейнер может шедулером подняться где угодно

А контейнеры в принципе не админят по ssh, они immutable, их надо готовить в CI-системе перед деплоем на облако, а не настраивать после.

Собствено с виртуалками та же история. Когда их много, динамически создаваемых, переезжающих между железными хостами и т.п., ими уже не управляют индивидуально. Их точно как контейнеры готовят заранее и запускают с cloud-init-параметрами. Готовят в CI-системе, тестируют и выкатывают на облако. И никаких апдейтов внутри виртуалки, только полная переналивка.

alpha ★★★★★
()
Последнее исправление: alpha (всего исправлений: 1)
Ответ на: комментарий от ivlad

Дело же не в размере на самом деле, а в культуре. И не всегда ты можешь поменять эту культуру и инфру, приходится работать с тем что есть, так что ТС-а в принципе понять можно.

Но конечно раздражает, когда в подобных случаях вместо того чтобы честно сказать «да у нас бардак, так что крутимся как можем» начинают аппелировать к размеру, и энтерпрайзности и гордиться этим бардаком как символом своей исключительности.

alpha ★★★★★
()
Ответ на: комментарий от alpha

Еще один пятизвездочный, который

место того, чтобы сказать «да у нас порядок, так что крутимся как можем», начинает аппелировать к размеру, и бюрокаратичности и гордиться этим порядком как символом своей исключительности.

Видели мы «порядок», видели «бардак». Знаем что за этими словами стоит, и сколько бардака спрятано за внешним порядком и сколько порядка прикрыто внешним бардаком. Уверен, ты тоже видел.
Так что там по разультату «grep -i ssh»?

anonymous
()

1. Выделяете один прокси-сервер. Ну или прокси-учетку. Например на сервере proxy учетную запись agent

2. Все удаленные системы монтируете как sshfs например в /home/agent/consumers/<servername>. Например:

/home/agent/consumers/gazprom.com
/home/agent/consumers/lukoil.com
/home/agent/consumers/roga-i-kopyta.name

Итак, вы только что решили проблему с scp - просто копировать вы будете не в root@remoteserver/path/file, а в agent@proxy/home/agent/consumers/<remoteserver>/path/file, например:

junworkstation ~$ scp \
>    /git/shiproject/shit.conf \
>    agent@proxy:/home/agent/consumers/gazprom.com/etc/not-a-shit.conf

3. Настраиваете sudo так, чтобы ваши пользователи могли сделать sudo -u agent. Тогда все смогут зайти по SSH на proxy и оттуда сделать команду у клиента. Ну или просто зайти к клиенту:

junworkstation ~$ ssh jundev1@proxy
***
*** Welcome, junior!
*** Beware unstable commits!
***
jundev@proxy ~$ sudo -u agent ssh agent@gazprom.com

А потом можно сделать

alias mssh="sudo -u agent ssh"
и писать:
mssh agent@gazprom.com

Всё что вам осталось - это грамотно администрировать proxy. Правда тут некуда пришить эрланг, поэтому это решение для вас не подойдёт.

Nastishka ★★★★★
()
Ответ на: комментарий от Nastishka

ну и потом sudo можно урезать до sudo -u agent ssh и так далее. В общем, всё просто.

С вас $500 за консультацию.

Nastishka ★★★★★
()
Ответ на: комментарий от alpha

Сказал ровно то же, что и ты, но про тебя. То есть сделал за тебя твою работу - саморефлексию, применил сказанное к тебе самому. Не подменил ли ты сличайно или преднамеренно, осознанно или неосознанно твой так называемый порядок бардаком, а бардак - порядком. Говорят, иногда помогает осадить зазнавшихся критиков.
Так как саморефлексия со стороны выглядит достаточно жалко и отталкивающе, поэтому лучше вернуться к обсуждаемой теме, так что там по результату «grep -i ssh».

anonymous
()
Ответ на: комментарий от anonymous

так что там по результату «grep -i ssh»

Ожидание окончания стандартного ввода? // мимокрокодил

aedeph_ ★★
()
Ответ на: комментарий от shell-script

shell-script статус 5 звезд модератор. Какие модераторы, такие же содержательные темы.

anonymous
()
Ответ на: комментарий от max_lapshin

https://github.com/moul/sshportal

По диагонали посмотрел ридми. Годно и достойно. Самое интресное это admin-shell и возможно работа с бд. Остальное (ssh-proxy, telnet, пользователи и тому подобное) думаю прямолинейная автоматизация рутины в командной строке. Ну что, есть пример, можно повторить, можно сделать что-то свое, успехов.

anonymous
()
Ответ на: комментарий от max_lapshin

больше одного пользователя на сервере бывает у бородатых троглодитов, которые ещё не поняли, что 80-е закончились и заводить несколько _живых_ пользователей на одном сервере — это треш и не работает.

Ват? Серьёзно?

Dark_SavanT ★★★★★
()
Ответ на: комментарий от max_lapshin

Так вроде задача как раз логично решается административным методом: на тех серверах заводится отдельный пользователь(о ужас!!!), ему назначаются разумные с точки зрения клиента права и authorized_keys контролируются уже вами. Но конечно же продавить админов клиента на чуть-чуть поработать - это задача малоподьёмная.

Окай.

Как бонус клиент может прибить весь ваш зоопарк одним движением, особенно если есть что-то типа chef

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от Dark_SavanT

Об этом всем и речь: причесать сотни админов под одну гребенку сложно. Бывают те, кто регулярно автоматически переливает сервера, бывают те, кто нам плейнтекстом пароли шлет.

Один публичный ключ - это просто и удобно, хотя для этой задачи может показаться непривычным.

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от Dark_SavanT

разве хоть что-то может быть сравнимо по безопасности с компьютером, который лежит отключенный от всего в сейфе?

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от max_lapshin

Мах - тебя как проггера я оценить не могу, не владею erlong-ом. Но дури в голове у тебя предостаточно :) Что там классики и отцы-основатели говорили про автоматизацию бардака напомнить? :)

Ну а теперь хорошие новости - никого не слушай, главная идея - рабочая!

У меня в ещё 2005 году шеф сам сделал подобное на основе openssh-server, юзеры (наш саппорт) сидели в нашем LDAP, единственное отличие было вот это: ssh usrer1@ssh-proxy - хрена вам ssh admin1@ssh-proxy - здрасте, можно сделать\удалить нового клиента, ключи прописать ssh usrer1@ssh-proxy:1001 - хрена вам, user1 к клиенту 1001 не допущен ssh usrer1@ssh-proxy:1002 - вперёд, ковать пока горячо ssh admin1@ssh-proxy:1001 - хрена вам, не admin-ское это дело - к чужому sander parsonклиенту лазать

anonymous
()
Ответ на: комментарий от max_lapshin

Существует всего ДВА способа пустить в консоль сервера: 1. ключ (один на всех - ДЕБИЛИЗМ) 2. логин+пароль.

Все. тебе выбирать.

bigov
()
Ответ на: комментарий от max_lapshin

еще безопаснее - снять винт и рабить молотком. Никто не считает приватные данные.

bigov
()

Лучше иметь каждому сотруднику свой ключ для ssh. И после увольнения со всех серверов поудалять соответствующий открытый ключ.

rumgot ★★★★★
()

ну а сделать доступ через openvpn и не давать пробросить вовне порты кроме стандартных как это делается во всех компаниях не судьба ?

Сотрудники имеюшие рутовый доступ на сервер - там могут поставить все что угодно - тут не убережешся, разве что логгировать их действия и ограничивать

Jopich1
()
Последнее исправление: Jopich1 (всего исправлений: 1)
Ответ на: комментарий от max_lapshin

А условие про недоступность приватного ключа пропустили?

Приватный ключ лежит у пользователя agent.

Принадлежит пользователю root, группе agents.

В группу agents никто не включен.

Имеет права ---.r--.--- (0040).

В /usr/local/bin лежит копия ssh принадлежащая root:agents с правами r-x.r-s.r-x (setgid).

Пользователь agent приватного ключа более не прочтёт

Но при вызове /usr/local/bin/mssh ключ прочтется.

Но только этой программой, никакой другой.

Nastishka ★★★★★
()
Последнее исправление: Nastishka (всего исправлений: 1)

Шире используйте стандартные инструменты, в этом нет ничего сложного.

Nastishka ★★★★★
()
Ответ на: комментарий от max_lapshin

Не нормально иметь всем один ключ. Все аргументы против - от лени.

rumgot ★★★★★
()
Ответ на: комментарий от max_lapshin

Те куча портов и на каждом свой ssh?

Нет, демон один, но слушает туеву хучу портов. Это был support engineers jump box в компании B**ware. C 2005 и до скоропостижной в 2009 :(

anonymous
()
Ответ на: комментарий от anonymous

Но шеф был могуч! :) Он даже свой ЯП сделал - его ещё короткое время целая Toshiba Inc. юзала! Правда они быстро поняли что лучше писать на чём то, что похуже, но для чего программеров - как грязи :-)

anonymous
()

Тред не читал, но обычно для каждого пользователя генерируется свой ssh-ключ. Публичные заливаются в authorized_keys каждого сервера. Если работник увольняется, его ключи удаляют (можно автоматизировать с помощью ansible или подобных утилит).

te111011010
()
Ответ на: комментарий от te111011010

Почитай, там уже сказали почему не осилили сделать хорошо.

Dark_SavanT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.