리눅스에서의 sudo와 권한 관리 (1)
이 글은 리눅스에서 sudo를 소개하고, 권한 관리에 대해 생각해본다. 예시 중에서 사용자를 생성하는 방법 또한 다룬다.
참고 자료
기준 환경:
Ubuntu 20.04.1 LTS (WSL2 by Windows 10 x64)
su와 sudo는 약자이다. su는 “substitute user”, sudo는 “substitute user do”이다.
리눅스에서의 su 사용법과 사용자 생성
su는 현재 로그인된 사용자에서 다른 사용자로 로그인하는 것이다.
사용자 목록은 cat /etc/passwd
로 볼 수 있다. (이름과 다르게 비밀번호가 나오진 않는다.)
각 사용자의 암호화된 비밀번호를 확인하려면 cat /etc/shadow
를 확인하라.
어떤 암호화가 쓰였는지는 cat /etc/pam.d/common-password
로 확인할 수 있다 - 기준 환경에서는 sha-512
를 사용한다. (출처: What methods are used to encrypt passwords in /etc/passwd and /etc/shadow?)
재밌는 점은, 사용자가 직접 만든 계정이 아닌 경우 로그인할 수 없게 되있다는 점이다. (출처: What are the default passwords of these users: nobody, daemon, uucp, etc.?)
만약 ‘사람이 사용하는 용도의’ 사용자 목록을 확인하려면, cat /bin/bash /etc/passwd
로 확인할 수 있다.
사용자를 추가해서, 해당 사용자로 로그인해보자.
1 | sudo useradd tmp # tmp는 유저명이다. 나머지는 자동으로 생성해준다. (단, 비밀번호가 없는 상태이다.) |
이렇게 로그인하면 bash가 사라지고, sh가 셸로 사용된다. (chsh
로 바꿀 수 있다.)
사용자가 sudo를 사용할 수 있게 만들기, sudo의 권한에 대하여
sudo는 특정 작업을 root 권한으로 수행할 수 있게 하는 명령어이다. 특정 사용자를 sudo 그룹에 추가하기만 하면 된다: sudo usermod -aG sudo {사용자명}
. 이후 사용자는 sudo 명령어를 사용할 수 있게 된다.
각 유저에 대한 권한은 /etc/sudoers
에 있는데, 권한의 포멧이 있다: %sudo ALL=(ALL:ALL) ALL
이것인데, (출처: How To Edit the Sudoers File)
%sudo | ALL= | (ALL: | ALL) | ALL |
---|---|---|---|---|
username 규칙 | hostname 규칙 | sudo로 로그인할 수 있는 사용자 목록 | sudo로 로그인할 수 있는 그룹 목록 | root 권한으로 사용할 수 있는 명령어 |
지금 알고 있는 지식으로는 sudo 파일의 Best Practice를 소개는 어렵기 때문에 추후로 미루지만, 권한 제어를 폭 넓게 할 수 있도록 필드가 5개나 된다는 점은 확인할 수 있었다. (아직 한 번도 sudoer 설정을 만져본 적이 없다는 점은 좀 부끄럽기도 하다.)
sudo의 장점
출처: Best practices for hardening sudo?
sudo는 Root Password 공유를 막는다.
syslog
등의 명령을 통해, sudo를 사용하는 경우 원격 서버로 로그를 전송하게 해서 더 빠르게 침입을 알아낼 수 있다.제대로 권한 설정만 한다면 Root 권한보다 많이 축소되므로 침입자가 모든 기록을 말소하지 못하게 할 수 있다. (온전한 root 권한을 탈취 당한 경우 아무 소용이 없게 된다.)
위 출처의 아래 답변에서 얻은 사실인데,
ssh_user
그룹을 만들어 remote login만 가능하게 하면 공격자가 ssh credential을 탈취하더라도 sudo 명령을 활용할 수 없기 때문에 보안 상 더 안전하다고 한다. (굉장히 유용한 방법인 듯하다.)
TODO:
- 프로덕션 배포용 서버에 적절한 sudoer 설정에 대해 찾아보기
- sudo 등의 예시 외에도 리눅스 상에서 보안 관련한 기능과 설정들을 찾아보기
리눅스에서의 sudo와 권한 관리 (1)