Аутентификация с открытым ключом SSH с помощью аутентификатора Google по-прежнему запрашивает пароль

. Я пытаюсь включить 2FA с ssh, используя libpam-google-Authenticator. Не всем пользователям требуется включить аутентификатор. Все используют открытые ключи ssh, и ни у кого нет пароля. Я использую Debian buster, а также пробовал libpam-google-Authenticator из яблочко.

Моя проблема в том, что независимо от того, что я добавляю в конфигурацию PAM, пользователи без включенного аутентификатора никогда не входят в систему напрямую, а всегда запрашивают пароль .

Я установил libpam-google-Authenticator и настроил / etc / ssh / sshd_config с:

PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PasswordAuthentication no
PermitEmptyPasswords no

Мне не удалось разработать правильную конфигурацию PAM, чтобы пользователи без файла .google_authenticator по-прежнему входили в систему В зависимости от того, что я использую, пользователям либо предлагается ввести пароль (у них его нет), либо не разрешается вообще.

В /etc/pam.d/sshd я пробовал (вот так Попытка получить SSH с открытым ключом (без пароля) + аутентификатор Google, работающий на Ubuntu 14.04.1 ):

#@include common-auth
auth       required     pam_google_authenticator.so debug nullok

В этом случае пользователям без настройки аутентификатора будет отказано в следующей отладке:

Aug 05 15:11:18 <host> sshd(pam_google_authenticator)[746624]: debug: start of google_authenticator for "<user>"
Aug 05 15:11:18 <host> sshd(pam_google_authenticator)[746624]: debug: end of google_authenticator for "<user>" Result: The return value should be ignored by PAM dispatch
Aug 05 15:11:18 <host> sshd[746620]: error: PAM: Permission denied for <user> from <IP>

Требуется ли pam_permit для настройки случая отката?

I ' Мы также пробовали различные комбинации требуется авторизация и достаточная авторизация до и после @include common-auth , но все они приводят к тому, что у пользователей без аутентификатора запрашивается пароль а иногда у пользователей С аутентификатором также запрашивается пароль.

Есть ли у кого-нибудь рецепт, как заставить эту работу работать?

2
задан 5 August 2021 в 07:28
2 ответа

Вот моя рабочая конфигурация. У некоторых пользователей включен аутентификатор, а у некоторых нет, и разрешены только входы в систему SSH с открытыми ключами, а не пароли.

В /etc/ssh/sshd_config,

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PermitEmptyPasswords no

в /etc/pam.d/sshd,

# Standard Un*x authentication.
#@include common-auth

# Require authenticator, if not configured then allow
auth    required    pam_google_authenticator.so debug nullok
auth    required    pam_permit.so

@include comon-auth должен быть отключен, так как он включает pam_unix, который я не хочу использовать. Затем вам нужно pam_permit, чтобы аутентификация была успешной для пользователей без аутентификатора (для которых pam_google_authenticator возвращает игнорирование, а не прохождение).

Это по-прежнему не позволяет пользователю root войти в систему с ключом ssh; журналы sshd

sshd[1244501]: fatal: Internal error: PAM auth succeeded when it should have failed

Это обсуждается в PAM Google Authenticator на SSH блокирует вход root без 2FA .

После того, как это заработало, как описано выше, я думаю, что на самом деле лучше использовать 2FA для определенных групп, используя конфигурацию SSH, как предложил @zoredache. Это легко позволяет вам внести в белый список определенные IP-адреса как не требующие 2FA. В этом случае sshd_config говорит, например,

UsePAM yes
PasswordAuthentication no
ChallengeResponseAuthentication yes
#AuthenticationMethods any # default
PermitEmptyPasswords no

Match Group adm Address *,!172.16.1.0/24
    AuthenticationMethods publickey,keyboard-interactive

, а /etc/pam.d/ssh говорит

 Standard Un*x authentication.
#@include common-auth

# Require authenticator; SSH should not allow any user in who doesn't have it
auth       sufficient   pam_google_authenticator.so debug nullok
auth       requisite    pam_deny.so
0
ответ дан 10 August 2021 в 02:52

Я не думаю, что вам нужно комментировать @include common-auth. Или, по крайней мере, я этого не делал, и это, казалось, работало правильно. Но я все еще в основном тестирую это.

Есть ли у кого-нибудь рецепт, как заставить это работать?

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

- hosts: linux_systems
  tasks:

  - name: Add group 'totp'
    group:
      name: totp
      state: present
      system: yes

  - name: Create directory for totp secrets
    file:
      state: directory
      path: /var/lib/google-authenticator
      owner: "0"
      group: "0"
      mode: "0700"

  - name: install libpam-google-authenticator
    apt:
      update_cache: yes
      cache_valid_time: '{{ apt_cache_valid_time | default(7200) }}'
      state: present
      name:
      - libpam-google-authenticator

  - name: Create secret for 'example-user'
    args:
      creates: /var/lib/google-authenticator/example-user
    shell: |
      TOTP_USER=example-user; \
      google-authenticator \
        --force --quiet \
        --emergency-codes=10 \
        --time-based \
        --qr-mode=none \
        --allow-reuse \
        --window-size=3 \
        --rate-limit=4 --rate-time=30 \
        --secret=/var/lib/google-authenticator/${TOTP_USER}

  - name: update pam
    lineinfile:
      insertafter: '^@include common-password'
      path: /etc/pam.d/login
      line: 'auth required pam_google_authenticator.so nullok user=root secret=/var/lib/google-authenticator/${USER}'

  - name: update pam
    lineinfile:
      insertafter: '^@include common-password'
      path: /etc/pam.d/sshd
      line: 'auth required pam_google_authenticator.so nullok user=root secret=/var/lib/google-authenticator/${USER}'

  - name: update sshd ChallengeResponseAuthentication
    notify: Restart sshd
    lineinfile:
      path: /etc/ssh/sshd_config
      regexp: '^ChallengeResponseAuthentication .*'
      line: 'ChallengeResponseAuthentication yes'

  handlers:

  - name: Restart sshd
    service:
      name: sshd
      state: restarted
0
ответ дан 5 August 2021 в 07:45

Теги

Похожие вопросы