Прописуємо процедуру екстреного доступу до хостів SSH з апаратними ключами

Прописуємо процедуру екстреного доступу до хостів SSH з апаратними ключами

На цьому посту ми розробимо процедуру для екстреного доступу до хостів SSH, використовуючи апаратні ключі безпеки в автономному режимі. Це лише один з підходів, і ви можете адаптувати його під себе. Ми зберігатимемо центр сертифікації SSH для наших хостів на апаратному ключі безпеки. Ця схема працюватиме практично на будь-якому OpenSSH, включаючи SSH з єдиним входом.

Навіщо все це? Ну це варіант на крайній випадок. Це бекдор, який дозволить вам отримати доступ до свого сервера в тому випадку, коли з якоїсь причини нічого більше не допомагає.

Навіщо використовувати сертифікати замість відкритих / закритих ключів для екстреного доступу?

  • На відміну від відкритих ключів термін дії сертифікатів може бути дуже коротким. Ви можете створити сертифікат, дійсний протягом 1 хвилини або навіть 5 секунд. Після цього терміну сертифікат стане непридатним для нових підключень. Це ідеально підходить для екстреного доступу.
  • Ви можете створити сертифікат для будь-якого облікового запису на своїх хостах і при необхідності надсилати такі «одноразові» сертифікати колегам.

Що вам знадобиться

  • Апаратні ключі безпеки підтримують резидентні ключі.
    Резидентні ключі – це криптографічні ключі, які повністю зберігаються усередині ключа безпеки. Іноді вони захищені літерно-цифровим PIN-кодом. Відкрита частина резидентного ключа може бути експортована з ключа безпеки, за потреби разом із дескриптором закритого ключа. Підтримку резидентних ключів мають, наприклад, USB-ключі серії Yubikey 5. Бажано, щоб вони призначалися тільки для екстреного доступу до хоста. Для цього посту я використовуватиму лише один ключ, але у вас повинен бути додатковий для резервного копіювання.
  • Безпечне місце для зберігання цих ключів.
  • OpenSSH версії 8.2 або вище на вашому локальному комп'ютері та серверах, до яких ви хочете отримати екстрений доступ. Ubuntu 20.04 постачається з OpenSSH 8.2.
  • (необов'язково, але бажано) Засіб CLI для перевірки сертифікатів.

Підготовка

Для початку потрібно створити центр сертифікації, який перебуватиме на апаратному ключі безпеки. Вставте ключ і запустіть:

$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]

Як коментар (-C) я вказав [захищено електронною поштою], щоб не забути, до якого ключа безпеки належить цей центр сертифікації.

Крім додавання ключа до Yubikey, локально буде згенеровано два файли:

  1. sk-user-ca, дескриптор ключа, який посилається на закритий ключ, що зберігається у ключі безпеки,
  2. sk-user-ca.pub, який буде відкритим ключем для центру сертифікації.

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

На хостах від імені користувача root додайте (якщо ще не додали) конфігурацію вашого SSHD (/etc/ssh/sshd_config) наступне:

TrustedUserCAKeys /etc/ssh/ca.pub

Потім на хості додайте відкритий ключ (sk-user-ca.pub) у /etc/ssh/ca.pub

Перезавантажте демон:

# /etc/init.d/ssh restart

Тепер ми можемо спробувати отримати доступ до хоста. Але спершу нам знадобиться сертифікат. Створіть пару ключів, які будуть пов'язані з сертифікатом:

$ ssh-keygen -t ecdsa -f emergency

Сертифікати та SSH-пари
Іноді так і тягне використовувати сертифікат як заміну пари відкритий/закритий ключ. Але для аутентифікації користувача одного сертифіката недостатньо. Кожен сертифікат також має закритий ключ, пов'язаний із ним. Ось чому нам потрібно згенерувати цю пару «екстренних» ключів, перш ніж ми видамо сертифікат. Важливо те, що підписаний сертифікат ми показуємо серверу із зазначенням пари ключів, для яких у нас є закритий ключ.

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

Далі створіть сам сертифікат. Мені потрібна авторизація користувача ubuntu у 10-хвилинному інтервалі. Ви можете зробити по-своєму.

$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency

Вам буде запропоновано підписати сертифікат за допомогою відбитків пальців. Ви можете додати додаткові імена користувачів, розділені комами, наприклад -n ubuntu,carl,ec2-user

Все, тепер у вас є сертифікат! Далі потрібно вказати правильні дозволи:

$ chmod 600 emergency-cert.pub

Після цього ви можете ознайомитись із вмістом вашого сертифіката:

$ step ssh inspect emergency-cert.pub

Ось як виглядає мій:

emergency-cert.pub
        Type: [email protected] user certificate
        Public key: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
        Signing CA: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
        Key ID: "test-key"
        Serial: 0
        Valid: from 2020-06-24T16:53:03 to 2020-06-24T17:03:03
        Principals:
                ubuntu
        Critical Options: (none)
        Extensions:
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

Тут відкритий ключ - це створений нами ключ emergency, а з центром сертифікації пов'язаний sk-user-ca.

Нарешті ми готові запустити команду SSH:


$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$

  1. Тепер ви можете створювати сертифікати для будь-якого користувача на хості, який довіряє вашому центру сертифікації.
  2. Ви можете видалити emergency. Ви можете зберегти sk-user-ca, але це не потрібно, оскільки він також знаходиться на ключі безпеки. Можливо, ви також захочете видалити вихідний відкритий ключ PEM зі своїх хостів (наприклад, ~/.ssh/authorized_keys для користувача ubuntu), якщо ви використовували його для екстреного доступу.

Екстрений доступ: план дій

Вставте ключ безпеки та запустіть команду:

$ ssh-add -K

Таким чином, ви додаєте відкритий ключ центру сертифікації і дескриптор ключа в SSH-агент.

Тепер експортуйте відкритий ключ, щоб зробити сертифікат:

$ ssh-add -L | tail -1 > sk-user-ca.pub

Створіть сертифікат із терміном придатності, наприклад, не більше години:

$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub

І тепер знову SSH:

$ ssh -i emergency username@host

Якщо файл .ssh/config викликає якісь проблеми під час підключення, ви можете запустити ssh з -F none, щоб обійтися без нього. Якщо вам потрібно відправити сертифікат колезі, найпростіший і найбезпечніший варіант — це Magic Wormhole. Для цього знадобиться всього два файли – у нашому випадку це emergency та emergency-cert.pub.

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

На правах реклами

Епічні сервери - це дешеві VPS з потужними процесорами від AMD; частота ядра CPU до 3.4 GHz. Максимальна конфігурація дозволяє вирішити практично будь-які завдання – 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Приєднуйтесь!

Прописуємо процедуру екстреного доступу до хостів SSH з апаратними ключами

Джерело: habr.com

Додати коментар або відгук