SSH - 공개 키가 있어도 정기적으로 비밀번호가 필요합니다.

SSH - 공개 키가 있어도 정기적으로 비밀번호가 필요합니다.

공개 키 인증을 허용하면서도 24시간마다 사용자 비밀번호를 입력하도록 요구하려면 어떻게 해야 합니까? 기본 호스트 운영 체제는 Debian입니다.

답변1

매뉴얼 페이지 보기sshd_config(5)어떤 방식으로든 이를 달성하는 데 사용할 수 있는 몇 가지 구성 키워드를 찾았습니다.

  1. 수정된 것을 사용하세요AuthenticationMethodsMatch막힌
  2. 사용AuthorizedKeysCommand로그인할 때마다 스크립트를 호출하여 비밀번호가 필요한지 결정하세요.
  3. 사용ForceCommand로그인 성공 후 사용자 지정 명령을 실행하여 필요한 비밀번호를 확인하세요.

상세히:

  1. 수정된 것을 사용하세요AuthenticationMethodsMatch차단: 이를 통해 공개 키 인증을 비활성화하거나또한특정 사용자에게는 비밀번호 확인이 필요합니다.
Match User john
        AuthenticationMethods publickey,password publickey,keyboard-interactive

이렇게 하면 사용자는 john공개 키 인증에 성공한 후 비밀번호를 입력해야 합니다. 하지만 정기적으로 바뀌어요어느사용자는 약간 까다로운 비밀번호를 입력해야 합니다. 한 가지 방법은 사용자 정의 스크립트를 변경하여 sshd_config사용자를 추가/제거하고 구성을 다시 로드하는 신호를 내보내는 것입니다 sshd. 이는 매우 불쾌한 해킹입니다.

내가 동적으로 보는 유일한 방법은 다음 Match과 같습니다 Group.

Match Group need-passwd
        AuthenticationMethods publickey,password publickey,keyboard-interactive

이렇게 하면 변경할 필요 없이 sshd_config시스템 그룹에 사용자를 개별적으로 추가/제거하기만 하면 됩니다 need-passwd. sshd그런 다음 사용자가 그룹에 있는지 확인하고 그렇다면 비밀번호도 필요합니다.

  1. 사용AuthorizedKeysCommand로그인할 때마다 스크립트를 호출하여 비밀번호가 필요한지 결정하세요.
# ignore existing authorized_keys files by default
AuthorizedKeysFile /dev/null
# instead load allowed authorized_keys using external command
AuthorizedKeysCommand /path/to/external_script.sh
# root is required to be able to read users ~/.ssh/authorized_keys files
AuthorizedKeysCommandUser root

sshd이를 직접 확인 하지 않고 ~/.ssh/authorized_keys사용자 지정 논리를 구현할 수 있는 곳에 제공된 키를 사용합니다 external_script.sh. 예: * 사용자의 마지막 성공한 원격 로그인 찾기 * 24시간 이상 전인 경우 인증 키를 반환하지 않으므로 공개 비활성화가 작동합니다. 키 인증* 지난 24시간 이내였다면 다음을 반환하세요.~/.ssh/authorized_keys

후자는 사용자의 홈 폴더에 있는 파일을 읽으려면 액세스가 external_script.sh필요한 이유입니다.root

1. 및 3.에 비해 이 접근 방식의 단점은 비밀번호만 로그인하도록 허용하여 실제로 보안을 저하시켜야 한다는 것입니다.

  1. 사용ForceCommand로그인 성공 후 사용자 지정 명령을 실행하여 필요한 비밀번호를 확인하세요.

ssh사용자가 클라이언트에 제공한 명령을 실행하는 대신 공개 키를 사용하여 로그인에 성공한 후에 실행됩니다 . ForceCommand이 명령에서 사용자 정의 논리(위 참조)를 구현하고 필요한 경우 먼저 로그인 비밀번호를 요청할 수 있습니다. 그렇지 않으면 제공된 명령줄을 실행하면 됩니다.

여기서 단점은 올바르게 이해하기 어렵다는 것입니다. * 명령이 실행되기만 하기 때문입니다.뒤쪽에로그인에 성공하면 사용자는 이미 시스템에 로그인되어 있습니다. 이는 비밀번호를 입력하기 전에 요청된 포트/X11/ssh 프록시 전달이 이미 활성화되었을 수 있음을 의미합니다.* 제공된 명령줄(있는 경우)을 올바르게 처리해야 할 수도 있습니다. 모든 문자열을 조심스럽게 이스케이프 처리하세요.

또한 비밀번호/로그인은 사용자 정의 스크립트에 의해 쿼리되므로 클라이언트에서 지원/처리되지 않지만 ssh유효한 비밀번호가 필요합니다 tty.

인증 키를 반환하는 대신 방법 2와 3을 결합하여 행 앞에 모든 액세스 옵션을 추가 restrict하고 강제 사용자 정의만 수행할 수 있습니다 command.AUTHORIZED_KEYS_FILE_FORMAT.

답변2

이것은 어려운 질문입니다. 이 아이디어를 떠올리기 전에는 두 가지 다른 아이디어가 있었습니다.

내 접근 방식은 오전 3시에 루트 크론 작업을 실행하고 authorized_keys사용자 파일 이름을 authorized_keys.disabled. 그런 다음 사용자 내에서 .bashrc행의 이름을 authorized_keys.disabled다시 변경하여 authorized_keys하루 종일 로그인이 SSH 키를 사용할 수 있도록 할 수 있습니다.

cron 항목은 다음과 같습니다.

00 03 * * * mv --force /home/jennifer/.ssh/authorized_keys /home/jennifer/.ssh/authorized_keys.disabled

항목 .bashrc은 다음과 같습니다.

mv --force ~/.ssh/authorized_keys.disabled ~/.ssh/authorized_keys

내 계획에 구멍이 있을 수 있습니다. 아직 테스트하지 않았습니다.

관련 정보