諸行無常

by

개인키로 ssh 접속시 sudo 패스워드 입력하지 않기 (ubuntu focal)

SW 이야기

라는 내용으로 검색을 해보면, 국내 해외 가리지 않고 대부분 /etc/sudoersNOPASSWD를 사용하라고 한다.

그러나, 이는 sudo의 인증 자체를 무력화시키는 방법으로, 물리적 취약점 외에도 악의적 스크립트에 의한 root 탈취 등 보안 리스크가 크다고 볼 수 있다.

여기서는 pam-ssh-agent-auth를 이용하여 sudo에 ssh-agent 인증을 추가하는 방법을 알아본다.

libpam-ssh-agent-auth 설치

먼저 libpam-ssh-agent-auth를 설치한다.

$ sudo apt update
$ sudo apt install libpam-ssh-agent-auth

pam.conf 수정

pam.conf를 수정하여 위에서 설치한 libpam-ssh-agent-auth를 사용하도록 한다.

배포판에 따라 차이가 있지만 Ubuntu의 경우 /etc/pam.d 폴더가 존재하고 /etc/pam.d가 존재하면 /etc/pam.conf가 무시되기 때문에 /etc/pam.d를 수정해야 한다.

common-auth 상위에 오도록 아래와 같이 수정한다.

/etc/pam.d/sudo

...

# ssh-agent auth
auth       sufficient pam_ssh_agent_auth.so file=~/.ssh/authorized_keys
@include common-auth

...

sudo 버전이 1.8.5 미만인 경우, sudoers도 수정해야 한다.

/etc/sudoers ($ sudo visudo)

...

Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# ssh-agent auth
Defaults        env_keep+=SSH_AUTH_SOCK

...

따라했는데 안되는 이유

  1. ssh-agent가 켜져있고
  2. 키가 등록되어 있고
  3. 클라이언트에 ssh-agent 포워딩이 활성화되어 있고
  4. ~/.ssh/~/.ssh/authorized_keysroot또는 현재 사용자의 소유이며 자기 자신을 제외하고는 쓰기 권한이 없어야
    하는데 이 중 무언가 하나가 빠졌을 것이다.

그래도 모르겠는 경우

상기한 /etc/pam.d/sudopam_ssh_agent_auth.so가 있는 줄 끝에 debug를 붙인 다음 /var/log/auth.log를 잘 살펴보면 왜 안되는지 이유를 알려줄 것이다.

ssh-agent 인증의 보안성

기본적으로 포워딩되었다고 하더라도 ssh-agent 소켓은 다른 유저가 사용할 수 없다.

그러나 root는 모든 것이 가능하므로 당연히 내 ssh-agent 소켓을 접근해서 나의 개인키로 다른 곳에 인증하는 것 또한 가능하다.

root에 내가 아닌 다른 사람이 접근할 수 있는 환경이라면 NOPASSWD로 인한 보안 위협을 차단하고 새로운 형태의 보안 위협을 만드는 것이 될 수 있으므로 사용하지 않는 것이 좋겠다.