Послідовний і безпечний підхід до безкористувацьких облікових записів із SSH


13

Треба визнати, що мені подобаються сервери без паролів у деяких випадках. Типовий сервер вразливий для всіх, хто має фізичний доступ до нього. Тож у деяких випадках це практично можливо фізично заблокувати і з тих пір довіряти будь-якому фізичному доступу.

Основні поняття

Теоретично, коли я фізично дістаюсь до такого сервера, я повинен мати можливість виконувати завдання адміністрування без пароля, просто ввівши rootлогін, і мені не потрібно запитувати пароль. Те саме може стосуватися облікових записів користувачів, але фізично не можна отримати доступ до них. Тому не потрібні системні паролі для (випадкового) локального доступу.

Під час віддаленого доступу до сервера, або для адміністрації, або для облікового запису користувача, я сподіваюся завжди використовувати приватний ключ SSH. Налаштувати ключ SSH для щойно створеного облікового запису дуже просто, і тому системні паролі не потрібні для (звичайного) віддаленого доступу.

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

Висновок полягає в тому, що теоретично ми не потребували жодних системних паролів для таких випадків використання. Отже, питання полягає в тому, як нам налаштувати систему та облікові записи користувачів, щоб це відбулося послідовно та безпечно.

Інформація про місцевий доступ

Як ми можемо забезпечити доступ до кореневого облікового запису локально без пароля? Я не думаю, що ми можемо використовувати, passwd -dоскільки це зробить доступ до коренів занадто дозвільним, і непривілейований користувач може перейти на root безкоштовно, що неправильно. Ми не можемо використовувати, passwd -lоскільки це заважає нам увійти.

Зауважте, що локальний доступ стосується виключно доступу через локальну клавіатуру. Отже, чинне рішення не повинно дозволяти комутації користувачів (незалежно від використання suчи sudo).

Деталі віддаленого доступу

Донедавна вищезгадане рішення діяло б, але тепер SSH почав перевіряти наявність заблокованих облікових записів користувачів. Напевно, ми не можемо використовувати passwd -dз тих же причин. Ми не можемо використовувати, passwd -uоскільки він просто скаржиться, що це призведе до того, що passwd -dробить.

Для цієї частини є вирішення проблеми з підробленим паролем.

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

Можливо, також можна повністю вимкнути перевірку заблокованих облікових записів у SSH, але було б приємніше зберігати підтримку заблокованих облікових записів і просто мати можливість їх розблокувати.

Підсумкові ноти

Що мене цікавить - це рішення, яке дозволить вам увійти до кореневого облікового запису локально та всіх облікових записів, включаючи root, віддалено, без паролів. З іншого боку, рішення не повинно впливати на безпеку, за винятком чітко описаних способів, особливо не дозволяючи віддаленим користувачам отримати доступ до кореневого або іншого облікового запису користувачів. Рішення повинно бути достатньо надійним, щоб воно не викликало проблем безпеки опосередковано.

Прийнята та нагороджена відповідь може або не може описувати детальну конфігурацію окремих інструментів, але повинна містити ключові моменти для досягнення зазначених цілей. Зверніть увагу , що це , ймовірно , не може бути вирішена з допомогою звичайного використання таких інструментів , як passwd, ssh, su, sudoтощо.

Більше ідей після прочитання перших відповідей

Просто ідея - локальний доступ до кореня можна досягти, запустивши кореневі оболонки замість процесів входу. Але ще потрібно заблокувати лише автентифікацію пароля, а не автентифікацію відкритих ключів.


Використовуйте налаштовану конфігурацію PAM для локального доступу без пароля та виконайте те ж саме для логотипів sudo та SSH.
0xC0000022L

Відповіді:


5

Вимоги, щодо яких я пропоную рішення, як точки кулі:

  1. Логін без пароля на кореневу консоль
  2. Віддалений логін для кореневого доступу без попередніх авторизованих користувачів
  3. Безперечний віддалений вхід для вказаних облікових записів від попередньо авторизованих користувачів
  4. Віддалене вхід без реєстрації для будь-якого облікового запису попередньо авторизованих користувачів

Наступні приклади засновані на Debian, оскільки я тут потрапив на тестування. Однак я не бачу жодної причини, чому принципи не можуть бути застосовані до будь-якого розподілу (або взагалі до будь-якого похідного * ix похідного типу).

Логін без пароля на кореневу консоль

Я думаю, що я б до цього підходив, використовуючи PAM та /etc/securettyфайл конфігурації.

В якості обов'язкової необхідності повинен бути встановлений "достатньо захищений" кореневий пароль. Це не потрібно для входу в консоль, але існує для того, щоб зробити спроби зламування грубої сили нереальними. Інакше рахунок є цілком нормальним кореневим рахунком.

У /etc/pam.d/loginмене є такий стандартний набір рядків для аутентифікації (ті, що починаються з ключового слова auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

Файл, що посилається, common-authмістить такі відповідні рядки:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

common-authФайл інструктує РАМ пропустити одне правило (забороняє) , якщо «UNIX Увійти» процвітає. Зазвичай це означає матч в /etc/shadow.

auth ... pam_securetty.soЛінія налаштована , щоб запобігти кореневі входи , крім як на TTY пристроїв , зазначених в /etc/securetty. (Цей файл вже включає всі консольні пристрої.)

authЗлегка змінивши цей рядок, можна визначити правило, яке дозволяє кореневе вхід без пароля з tty пристрою, зазначеного в /etc/securetty. success=okПараметр повинен бути змінений таким чином, що okзамінюється на число authрядків, що пропускаються в разі вдалого матчу. У наведеній тут ситуації це число є 3, яке переходить до auth ... pam_permit.soрядка:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

Віддалений логін для кореневого доступу без попередніх авторизованих користувачів

Це просто включення ssh-ключів для тих авторизованих користувачів, які додаються до кореневого authorized_keysфайлу.

Безперечний віддалений вхід для вказаних облікових записів від попередньо авторизованих користувачів

Це також просте включення ssh-ключів для авторизованих користувачів, що додаються до відповідного .ssh/authorized_keysфайлу користувача. (Типовий Chris віддаленого користувача бажає ввести без пароля локальний сценарій chris користувача .)

Зауважте, що облікові записи можуть залишатися у зачиненому за замовчуванням стані після створення (тобто, просто !в полі пароля для /etc/shadow), але дозволяють здійснювати вхід на основі ключа SSH. Для цього потрібен root, щоб розмістити ключ у .ssh/authorized_keysфайлі нового користувача . Що не так очевидно , що такий підхід доступний лише тоді, коли UsePAM Yesвін встановлений /etc/ssh/sshd_config. PAM розрізняє !як "обліковий запис заблокований паролем, але інші методи доступу можуть бути дозволені" та !..."обліковий запис заблоковано. Період". (Якщо UsePAM Noвстановлено, OpenSSH розглядає будь-яку присутність !запуску поля пароля для відображення заблокованого облікового запису.)

Віддалене вхід без реєстрації для будь-якого облікового запису попередньо авторизованих користувачів

Мені було не зовсім зрозуміло, хочете ви цього закладу чи ні. А саме, певні авторизовані користувачі змогли б не ввійти в електронну пошту без пароля на будь-який кожен локальний рахунок.

Я не можу перевірити цей сценарій, але я вважаю, що цього можна досягти за допомогою OpenSSH 5.9 або новішої версії, яка дозволяє authorized_keysвизначати кілька файлів у /etc/ssh/sshd_config. Відредагуйте файл конфігурації, щоб включити другий файл, який називається /etc/ssh/authorized_keys. Додайте до цього файлу відкриті ключі вибраних уповноважених користувачів, переконайтеся, що дозволи такі, що він належить root та має доступ для запису лише корінь (0644).


Мені доведеться більш уважно вивчити №1 і перевірити його. Це виглядає дуже цікаво, хоча для нього все ж потрібен (сильний) пароль. №3 не завершено, оскільки нині новостворений користувач за замовчуванням блокується також із SSH-входу. Я не дуже просив точки №4, але все одно це виглядає дуже цікаво, і я, можливо, використовую такий метод.
Павло Шімерда

Сильний пароль для root потрібен, але ніколи не використовується. Я припускав, що ви знаєте, як реалізувати №3; дайте мені знати, якщо вам потрібно детальніше. У системах (Debian) можна зайти в новий обліковий запис, у якому ще не було визначено пароль, за умови, що .ssh/authorized_keysфайл містить відповідний відкритий ключ. Чи допомагає це?
roaima

Я думаю, що мені потрібен приємний і стандартний спосіб відновити поведінку, яку ви бачите на Debian, тобто новостворений обліковий запис заблокований лише для автентифікації паролів, а не для відкритого ключа.
Павло Шімерда

Для тестового облікового запису користувача, який я створив, щоб підтвердити ssh-заяву в попередньому коментарі, я бачу !в полі пароля в /etc/shadow. Відповідно до сторінки man, це вказує на дійсний обліковий запис, для якого не може відповідати жоден пароль.
roaima

1
Це цікаво, що насправді не так очевидно , дякую.
Павло Шимерда

1

Це здається, що вам потрібні справжні (некореневі) облікові записи користувачів з ключами ssh та повним NOPASSWDдоступом через sudo(який доступний за замовчуванням у більшості дистрибутивів Linux в ці дні, а також тривіально встановлювати вручну). Ви можете мати порожні паролі для кожного облікового запису користувача (який не працюватиме віддалено), тоді користувач або працює, sudo -sабо користувач ~/.bash_profileпросто містить цю команду.

Судо

Додайте кожного користувача до sudoгрупи UNIX (наприклад usermod -a -G sudo USERNAME, хоча старіші системи мають менш інтуїтивні способи зробити це; в гіршому випадку ви редагуєте /etc/groupsбезпосередньо).

У /etc/sudoersабо /etc/sudoers.d/localпотрібно такий рядок:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Якщо ви хочете автоматичний кореневий доступ, додайте це до профілю користувача. Бо bashце було б ~/.bash_profile:

sudo -s

Це дозволить вам побачити, хто ввійшов у систему (спробуйте whoабо last), а також залишить журнали /var/log/auth.log.

Логін без пароля

У значно старших системах ви можете просто редагувати /etc/passwd(або на трохи старших системах /etc/shadow) і видаляти хеш, так що, наприклад, bob:$1$salt$hash:12345:0:99999:7:::стає просто bob::12345:0:99999:7:::. Це було все, що тобі було потрібно. Сучасні системи цього не люблять. Можливо, є й інші способи зробити це, але спосіб, який я щойно перевірив, полягає в наступному (джерело: випадкові речі Лева ) :

Відкрийте /etc/shadowі спостерігайте за обліковим записом з реальною інформацією. Це включає три елементи, розділені знаками долара ( $). Вони представляють механізм перемішування, потім сіль , потім хеш. Зверніть увагу на сіль, а потім запустіть це:

openssl passwd -1 -salt SALT

(Тут використовується механізм хешування MD5. Це порожній пароль, тому ви не повинні заперечувати.) Коли буде запропоновано ввести пароль, натисніть клавішу Enter. Збережіть цей рядок, включаючи будь-які кінцеві крапки, і вставте його після першої двокрапки в рядку цього користувача в /etc/shadow(це повинно замінити будь-який попередній вміст між першим і другим двокрапками). (Будь ласка, не використовуйте буквально SALTяк сіль!)

SSH

Ваша sshдемонова конфігурація живе або в, /etc/sshd_configабо в /etc/ssh/sshd_config. Для належної безпеки рекомендую включити такі рядки:

PermitRootLogin no
PermitEmptyPasswords no

Для отримання додаткових заходів безпеки, які ви можете додати до своєї конфігурації ssh, перегляньте інформацію про захищений захищений оболонку, щоб краще зміцнити її від складних зловмисників.

Тепер ваші користувачі не можуть увійти через sshчерез порожні паролі (це необхідний захід безпеки). Це означає, що вони можуть входити в систему лише за допомогою клавіш ssh.

Кожен користувач для кожної своєї клієнтської системи повинен створити пару ключів ssh, наприклад

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Це створює приватний ключ у $HOME/.ssh/id_rsaта відкритий ключ у $HOME/.ssh/id_rsa.pub. Запропонуйте цьому користувачу надіслати вам свої відкриті ключі та додати їх до цього сервера $HOME/.ssh/authorized_keys(зауважте, що кожен користувач $HOME/.sshповинен бути в режимі 700, наприклад mkdir -p ~user/.ssh && chmod 700 ~user/.ssh).

Користувачі, які не хочуть клавіші ssh, можуть перейти до фізичної системи. Там їх порожній пароль ввійде до них, і в цей момент вони можуть ввести passwdз оболонки і встановити пароль, тим самим дозволяючи їм віддалений доступ.

(Я фактично використовував цю методику, щоб повернути людям доступ до колекції систем, коли я запускав ІТ-відділ. Це змусило користувачів використовувати ключі ssh, і я не повинен був давати їм паролі. Їх початковий ~/.bash_profileбув внизу два рядки: passwdа потім, mv ~/.bash_profile.real ~/.bash_profileщоб вони встановили новий пароль при першому вході.)

Ризики

Ви довіряєте своїм користувачам. Ніщо не заважає користувачеві возитися з ~/.ssh/authorized_keysфайлом іншого користувача і таким чином змінювати вашу здатність відкликати та перевіряти доступ, але це неминуче, якщо ви надаєте повний кореневий доступ.

Висновок

Кожен користувач зараз є членом групи sudo і має повний безпаровий доступ до кореневої оболонки. Ці користувачі не мають паролів для своїх облікових записів і можуть увійти дистанційно, використовуючи клавіші ssh.

Якщо ви втратите одного зі своїх співробітників, ви можете видалити його / її рахунок. Якщо вкрадено ноутбук одного з ваших співробітників, ви можете вийняти ключ ssh цього ноутбука з authorized_keysфайлу цього користувача . Якщо ви порушили безпеку, у вас є журнали, які показують, хто ввійшов у систему.


Частина про sudo пропускає питання, оскільки мова йшла виключно про нові реєстрації, а не про переключення користувачів. Поправили питання, щоб зробити його зрозумілішим. Частина про безкористувацький логін демонструє таку саму неправильну поведінку, як і passwd -dв питанні, що дозволяє suпереходити до цього користувача без пароля. У розділі ризиків описані дві речі (псування з даними інших користувачів та отримання кореневого доступу), видалення яких - це сама суть питання. Тому, хоча окремі розділи добре написані, це аж ніяк не є відповіддю на питання.
Павло Шімерда

Я припускав, що ви додасте користувача, а потім обмежите його.
Адам Кац
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.