우분투 : 패스워드 없고, 직접 로그인도 불가능한 사용자 만들기. 덧붙여 sudoer 로.

** 이 방법을 쓰면, ssh, 공개키로만 로그인을 할 수가 있다. 즉, 기계(서버)에 직접 연결된 키보드로는 로그인이 불가능하다.

AWS Lightsail 로 우분투를 설치했더니, 관리자 계정은 무조건 ubuntu 이고, 패스워드는 없으며, 공개키로만 로그인을 할 수 있게 설정이 돼 있었다.
다시 말해, 가끔 첩보 영화/게임에 나오는 장면, 즉, 서버가 있는 서버룸으로 직접 가서, 연결된 키보드로 직접 로그인하는 자체가 불가능하다.

물론, 이 세상 어딘가 알지 못하는 곳에 있기도 하거니와, 게다가 ‘가상 기계’이므로 직접 키보드를 연결할 수도 없긴 하지만, 어쨌든, 이 방식이 보안엔 훨씬 좋아보였다.

그래서, 이 방식을 내 방구석 서버에도 적용해보려면 어떻게 해야 할까??
이게 이 글의 주제다.


이미 있는 계정을 저렇게 바꾸는데는 손이 좀 더 가지만, 새 사용자를 이런 식으로 생성하기는 조금은 쉽다.

새 사용자를 비밀번호 없이 생성, 관리자 권한 부여.

# 사용자 생성
$ sudo adduser newuser --disabled-password

# 사용자를 sudoer 로 추가 (sudo 그룹에 추가)
$ sudo usermod -aG sudo newuser

# 새로 만든 사용자로 ID 전환
# 여기서 비밀번호를 입력하라고 나오는데, 이 비번은 현재 로그인한 사용자의 비번이다. (newuser 은 비번이 없으므로, 입력할 수도 없다.)
$ sudo su - newuser
$ newuser@myserver:~$ 

사용자를 sudo 가능케 하는 방법은 한가지는 아닌데, sudo 그룹에 넣는 방법이 가장 간단해 보인다. (참고: digital ocean)

어쨌든 이렇게 새 사용자로 전환이 됨을 확인할 수 있는데.. 문제는 여기서 바로 sudo 를 내렸을 때 발생한다.

$ newuser@myserver:~$ sudo ls
[sudo] password for newuser: 

엥???
password 를 없게끔 설정했는데, 왜 패스워드를 물어??

…..
늘 하는 얘기지만, 세상은 그리 녹록질 않다.

이걸 가능하게 하려면, 한가지 설정을 더 해줘야 한다.

보통 이에 관해서 검색을 하면, visudo 를 사용하여 관련 명령을 넣으라고 하는데, 이보다는, 이 글에선, 요즘 추세인 연관 디렉토리(xxx.d)에 파일을 만들어 넣는 방법을 택했다.
이 방식의 장점으로는, 추가된 내용을 확연히 구분할 수 있고, 보관(Backup)이 편하다는 점을 들 수 있겠다.

단, 이를 위해선, sudo visudo 를 한 뒤, 다음 행이 있는지 확인해야 한다.

#includedir /etc/sudoers.d

#includedir 에서 # 는 주석이 아니다. 원래 문법이 저렇다.

AWS Lightsail 에선, /etc/sudoers.d/90-cloud-init-users 에 해당 내용을 넣어놓았다.

# User rules for ubuntu
ubuntu ALL=(ALL) NOPASSWD:ALL

이와 동일하게 /etc/sudoers.d/ 에 적절한 파일명을 만들고, 위 내용을 넣는다.
파일명은 꼭 90으로 시작하지 않아도 되는데, (쟤들이) 저렇게 했으니, 그냥 따라해본다.

단, 이 파일명에 확장자가 들어가 있으면 제대로 인식하지 못하는 듯 하다. 확장자를 실수로 .conf 를 붙였는데, 제대로 인식이 되지 않았다. (이 얘기는, 이를 수정하느라 또 꽃삽질을 했다는 의미가 된다.)

마지막으로, 이 파일의 허가권은 440 으로 해준다.

sudo chmod 440 /etc/sudoers.d/90-mysudoer

파일 내용은 다음과 같다. (user_a 에는 사용자명을 넣는다.)

# 90-mysudoer

user_a ALL=(ALL) NOPASSWD:ALL

정리하면 다음과 같다.

  • visudo 에서, #includedir /etc/sudoers.d 이 있는지 확인
  • /etc/sudoers.d/90-xxx 로 파일 생성. 파일명은 확장자 없이. (특히나 .conf 는 안됨)
  • 파일 허가권은 440 으로 설정.
  • 이 파일에 위 내용 붙여넣기.

또는, sudo visudo 한 뒤, 맨 아래에 저 내용을 붙여넣어도 된다.

** 특정 프로그램 실행 권한을 일반 사용자에게 주려면?

예를 들어, shutdown, apt 등을 일반 사용자도 실행할 수 있게 하려면? (물론 앞에 sudo 는 붙여야 한다.)

사용자에게 특정 권한을 주려면, /etc/sudoer.d/ 에 적절한 파일을 만들고 이런 내용을 덧붙이면 된다.

user_a ALL=(ALL) NOPASSWD: /bin/systemctl,/usr/bin/apt,/sbin/poweroff

이 내용에 대해선 다음 글 참고.

HowToGeek: 8 Ways to Tweak and Configure Sudo on Ubuntu

기존 사용자의 비밀번호 삭제, 계정 잠금.

** 역시나, 계정을 잠갔다고 하지만, ssh 접속은 가능하다.

이미 있는 기존 계정의 비밀번호를 없애고, 직접 로그인이 불가능하게 만들려면, 즉, 위에서 새 사용자를 만들 때 사용했던 adduser newuser –disabled-password 와 같게 만들려면, 다음 명령을 내린다.

sudo passwd -ld username
  • -d : Delete a user’s password
  • -l : Lock the password of the named account

위 작업은 /etc/shadow 파일에서 다음 내용을 변경하는 것과 같은 결과다.
자세한 사항은 nixCraft 참고.

# 일반 계정
testsudo:$6$어쩌고저쩌고:18191:0:99999:7:::

# 패스워드 있음 / 로그인 불가
testsudo:!$6$어쩌고저쩌고:18191:0:99999:7:::

# 패스워드 없음 / 로그인 불가
testsudo:*:18191:0:99999:7:::

# 패스워드 없음 / 로그인 가능 (id 만 넣으면 바로 로그인 됨)
testsudo::18191:0:99999:7:::

# 패스워드 없음 / 로그인 불가
testsudo:!:18191:0:99999:7:::

직접 shadow 파일을 편집할 필요는 없지만, 명령의 결과가 어디에 어떻게 적용되는지는 알아두는 게 좋기에 기록해놨다.

만약 이 계정을 sudoer 로 만들고 싶다면, 위의 새 계정 만들 때와 같은 방법을 사용하면 된다.

$ sudo usermod -aG sudo newuser

# 그리고, /etc/sudoers.d/ 에 파일 추가.

기존 사용자의 비밀번호 삭제/계정 잠금 해제

잠그기만 해고 해제할 수 없다면, 이것도 문제. 위에서 잠근 내용을 해제하는 방법도 정리한다.

위에서 passwd 명령을 사용했으므로, 여기서도 같은 명령을 사용한다.

먼저 계정잠금 해제.

# passwd -u <계정>

잠글 때는 -l (Lock) 을, 해제할 때는 -u (Unlock) 을.

다음, 계정에 다시 비밀번호 설정.

# passwd <계정>

위 계정 잠금/해제를, usermod 로 할 수도 있다.

# usermod --lock <계정>
# usermod --unlock <계정>

password 삭제도 usermod 로 가능하다.

# usermod -p '' <계정>

패스워드에 아무 것도 주지 않으면(”), 결국 비밀번호가 삭제된다.

다만, 비밀번호 재할당은 usermod 로 하기가 좀 애매하다. 연결 글에 있는 바와 같이, usermod -p 로 할 수는 있으나, 이 뒤에 오는 패스워드는 이미 암호화된(pre-encrypted password) 형태라야만 한다. 만약 평문으로 그냥 넣는다면, /etc/shadow 항목에도 그냥 평문이 들어가고, 결국 이 비밀번호로는 로그인할 수가 없게 된다.

따라서, 패스워드 재할당은 usermod 보다는 passwd 를 사용하는게 편하다.

# passwd <계정명>
Enter new UNIX password:
Retype new UNIX password:

ssh 공개키 추가.

위와 같이 계정을 막았다면, 반드시 ssh 공개키를 추가해야만 로그인이 가능하다.
이 작업을 안했다면 로그인할 길이 막힌다. 이럴 땐 Live Drive 로 부팅해서 shadow 파일을 수정하는 수밖엔 방법이 없다.

/home/새계정/.ssh 를 만들고, 그 아래 authorized_keys 파일을 만든 뒤, 공개키(id_ed25519.pub, 또는 id_rsa.pub)의 내용을 붙여넣는다.

또, authorized_keys 의 허가권을 600 으로 설정해야 한다.

ssh 서버 설정.

위 설정들이 의미가 있으려면, 서버의 ssh 에도 패스워드 로그인을 막는 설정을 해줘야 한다.

/etc/ssh/sshd_config 를 열고, 다음 항목들을 설정해준다.

PasswordAuthentication no
PermitEmptyPasswords no
PermitRootLogin prohibit-password 또는 no
PubkeyAuthentication yes

나머지는 딱히 설명할 필요가 없겠지만, PermitRootLogin 에 대해선 몇 글자 적어본다.

우분투에선 root 가 막혀 있다. 막혀있다는 의미가 바로, 이 글에서 설명한 위 방법을 사용해서, /etc/shadowroot:!:17907:0:99999:7::: 이런 형식으로 기록이 되어 있음을 뜻한다.

즉, 우분투/데비안에 root 계정이 없지는 않다. 계정은 있으나 Password 가 없기에, 단지 키보드를 사용해서 직접 로그인할 수 없을 뿐이다.
다시 말하면, root 로 ssh 로그인은 가능하다는 뜻이 된다.

따라서, 우분투에서는 PermitRootLogin prohibit-password 설정은 별 의미가 없다. 단, root 에 비밀번호를 부여하지 않았다는 전제하에 그렇다.
이 설정은 root 로 로그인은 할 수 있지만, password 로는 불가능하게끔 설정하라는 뜻이다. 즉, root 의 공개키로는 로그인이 가능하다는 의미가 된다.

그리하여, 아예 root 로그인을 막으려면, PermitRootLogin no 로 해야 한다.
no 로 하면, 아예 root 로는 어떤 방식으로도 로그인할 수가 없다.

다음 글에서 좀 더 자세한 내용을 볼 수 있다.

뭔가 빼먹은게 있을까???

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.