** 이 방법을 쓰면, 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/ 에 적절한 파일을 만들고 이런 내용을 덧붙이면 된다.
HowToGeek: 8 Ways to Tweak and Configure Sudo on Ubuntu
user_a ALL=(ALL) NOPASSWD: /bin/systemctl,/usr/bin/apt,/sbin/poweroff
이 내용에 대해선 다음 글 참고.
기존 사용자의 비밀번호 삭제, 계정 잠금.
** 역시나, 계정을 잠갔다고 하지만, 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/shadow 에 root:!:17907:0:99999:7::: 이런 형식으로 기록이 되어 있음을 뜻한다.
즉, 우분투/데비안에 root 계정이 없지는 않다. 계정은 있으나 Password 가 없기에, 단지 키보드를 사용해서 직접 로그인할 수 없을 뿐이다.
다시 말하면, root 로 ssh 로그인은 가능하다는 뜻이 된다.
따라서, 우분투에서는 PermitRootLogin prohibit-password 설정은 별 의미가 없다. 단, root 에 비밀번호를 부여하지 않았다는 전제하에 그렇다.
이 설정은 root 로 로그인은 할 수 있지만, password 로는 불가능하게끔 설정하라는 뜻이다. 즉, root 의 공개키로는 로그인이 가능하다는 의미가 된다.
그리하여, 아예 root 로그인을 막으려면, PermitRootLogin no 로 해야 한다.
no 로 하면, 아예 root 로는 어떤 방식으로도 로그인할 수가 없다.
다음 글에서 좀 더 자세한 내용을 볼 수 있다.
뭔가 빼먹은게 있을까???