강력한 리눅스 서버 보안 방법 중의 하나인 리눅스 서버 root 사용 중지로 서버 root 로그인 시도를 원천적으로 막음으로서 서버 보안 강화 및 서버 최적화 방법에 대해서 살펴보겠습니다.
대부분 서버의 가장 강력한 권한을 갖는 사용자는 Super User라고 할 수 있는 root 입니다. root만 장악하면 서버 전반을 좌지우지할 수 있기 때문에 해커의 중요한 타겟이 됩니다.
여기에 이 Super user 사용자 이름은 root로 만천하에 알려져 있기 때문에 강력한 컴퓨팅에 의한 스크립트 실행으로 다양한 비밀번호를 대입해 보면서 강제적인 roor 로그인을 시도할 수 있습니다.
그렇기 때문에 여기서는 우분투를 비롯한 리눅스 서버에서 roor를 사용하지 않고 서버를 운영하는 방법에 대해서 살펴보도록 하겠습니다. 아래 내용들은 우분투 20.04를 기준으로 설명합니다.
우분투를 비롯한 리눅스 서버 보안을 위해서 아래와 같은 사항들이 고려됩니다.
- ssh 접속 포트를 22번 포트가 아닌 다른 포트 사용
- ssh 접속 ip를 특정 ip대로 제한
예를들어 한국에서만 접속 가능토록 한국 ip로만 한정하든지 또는 집과 태블릿 접속 ip대로만 한정 - root 사용 중지 및 특정 사용자_ID만 사용
보안을 위해 사용자_ID를 굉장히 길고 복잡하게 만들어 해커가 사용자_ID 파악을 어렵게 만듬
그리고 root 사용 중지 - 사용자 비밀번호를 보안이 높도록 만들고, 가능하면 정기적 변경
- ssh key를 통한 접속으로 사용자_ID와 비밀번호를 통한 ssh 접속 방법이 한계 극복
우분투 서버 설치 시 기본 설정은 root 미사용
기본적으로 우분투를 설치하면 root를 사용할 수 없도록 되어 있습니다. 왜냐하면 root의 비밀번호가 설정되지 않았기 때문이죠.
그래서 root를 사용하려면 root 비밀번호를 설정한 후 사용할 수 있습니다.
그러나 Vultr와 같은 가상 서버 호스팅에서 우분투 서버를 설치하면 ip 주소가 정해지고, 기본 사용자로 root로 설정되고, root의 비밀번호도 정해집니다.
그래서 ssh 이용 시 주어진 ip주소와 root 사용자 그리고 주어진 root 비밀번호를 사용하게 됩니다.
서버 보안에서 강력히 권고하는 한가지 사항은 root를 사용하지말고 별도 사용자를 등록하고 별도 사용자에게 일부 root 권한을 행사하도록 하는 것입니다.
제가 Vultr에 root 사용자를 사용하지 않기위해 없애는 것이 가능한지 질문을 했는데요. Vultr에서는 불가능하다고 답변이 왔습니다.
그런데 구글링을 해보면 우분투에서 root를 사용하지 않을 수 있고, 오히려 root를 사용하지 말라고 권고가 많습니다. 그리고 위해서 한번 설명했지만 우분투는 기본적으로 root를 비활성한 채 설치된다고 합니다.
그래서 조금 더 고민해보고 구글링에 구글링을 거듭하다가 내린 결론은 제 질문이 잘못되었다는 것을 알 수 있었습니다.
- root 계정 자체를 없애는 것은 불가능
- 대신 root 비밀번호를 없애서 root가 없는 것처럼 우분투 서버 운영 가능
root 비밀번호 설정을 없애는 것은 root로 로그인 상태에서 passwd -dl root 명령으로 가능 - 따라서 root 비밀번호를 없애고, 특정 사용자를 root 수준의 권한을 준다면(sudo) root없이도 모든 작업이 가능
새로운 사용자 등록 및 sudo 권한 등록
사용자 등록 후 이 사용자에게 sudo 권한을 부여하는 방법은 아래와 같습니다.
위에서도 간단히 설명했지만 가능하는 한 사용자_ID를 복잡하고 유추하기 어렵게 만들어 외부 해커가 사용자_ID 파악을 어렵게 만들고, 더 나아가 비밀번호를 강화해 해킹 가능성을 낮추는 것이 목표입니다.
사용자 등록 및 sudo 그룹 등록
먼저 사용자 등록을 합니다.사용자는 가능하면 어렵고 쉽게 유추할 수 없는 이름을 사용합니다.
adduser 신규_사용자_ID
Code language: PHP (php)
이 신규_사용자_ID에 sudo 권한 부여를 위해서는 아래와 같이 sudo 그룹에 이 사용자_ID를 추가해 줍니다.
usermod -aG sudo 신규_사용자_ID
Code language: PHP (php)
이 명령은 root로 로그인 했을 때나 신규_사용자_ID로 로그인때나 사용 가능했습니다.
여기까지 진행되었다면 신규_사용자_ID로 sudo를 사용할 수 있습니다.
참고로 일부에서는 사용자 추가 시 동시에 sudo 기능을 추가할 수 있도록 아래와 같이 사용자 추가 시 sudo를 추가해주는 방법을 소개하는데요.
이 방법(아래 명령어)은 우분투 20.04에서는 작동하지 않았습니다.
sudo adduser 신규_사용자_ID sudo
Code language: PHP (php)
우분투 서버 root 사용 중지하기
이번에는 우분투 서버에서 root 사용 중지하는 방법에 대해서 알아봅니다.
앞서 설명한대로 root 사용자를 아예 없애는 것은 불가능합니다. 다만 root 비밀번호를 없애서 root를 사용하지 않토록 하는 방법이 있죠.
이는 root로 로그인 상태에서 아래와 같은 명령을 사용합니다. 아니면 특정 사용자로 로그인 상태라면 root 권한(sudo -i 옵션을 사용)을 획득한 상태에서 사용할 수 있겠죠.
불필요한 혼란을 방지하기 위해서 root 로그인 상태에서 아래 명령어를 사용합니다.
sudo passwd -dl root
Code language: PHP (php)
여기서 -l은 root 비밀번호를 lock한다는 의미에서 사용하는 옵션으로 보입니다. 이러면 이후부터는 root로 ssh 로그인이 안되고 root 사용이 안됩니다.
그러면 root를 다시 살리려면 어떻게할까요?
이미 root를 사용할 수 없도록 만들었기 때문 root를 사용하려면 아래 명령어를 사용합니다. 그리고 새로운 root 비밀번호를 설정할 수 있습니다.
sudo -i passwd root
Code language: PHP (php)
결국 sudo 권한을 획득한다는 것은 조금 불편하지만 언제든지 root 권한을 획득 할 수 있다는 것을 의미합니다.
그렇게 때문에 개인 사용자나 작은 스타트업에서는 sudo 권한을 가진 사용자를 만든다면 굳이 root 사용자가 필요없다는 결론에 이르고 이것이 더 보안에 유리한 것이 아닐까 싶습니다.
특정 사용자를 root처럼 사용하기
기업의 IT팀이 아니라면 root를 두고 여러 사용자를 등록시켜 일정 권한을 주는 방식이 바람직하기 때문에 root도 필요하고 각기 다른 낮은 사용 권한을 가진 사용자들도 필요합니다.
그러나 개인이 운영하는 서버이거나 작은 스타트업이라면 서버 운영 시 여러 사용자를 둘 필요는 없습니다.
단 한명의 사용자면 충분하죠. 귀찮은 경우 root를 그냥 사용하기도 합니다. 그렇지만 root를 그대로 사용하는 하는 것은 해킹 위험에 더 노출됩니다.
서버 공략 시 사용자로 root를 설정하고 여기에 다양한 비밀번호를 대입해 서버 로그인을 시도하기 때문입니다.
어짜피 서버에서는 root에 준하는 권한을 가진 한 사람은 반드시 필요하기 때문에 root를 사용중지하고 대신 특정 사용자_ID에 root에 준하는 권한을 주는 것이 더 효율적입니다.
해커는 root가 아닌 특정 사용자_ID를 찾아야 하고 거기서 또 비밀번호를 찾아야하기 때문에 그만큼 해킹 확률을 낮출 수 있습니다.
거기에 fail2Ban과 같은 보안 프로그램과 결합한다면 더욱 더 해킹 가능성을 낮출 수 있습니다.
- ssh 접속 포트를 22번 포트가 아닌 다른 포트 사용
- ssh 접속 ip를 특정 ip대로 제한
예를들어 한국 ip대로만 한정하든지 또는 집과 태블릿 접속 ip로만 한정 - root를 사용하지 않고 특정 사용자_ID만 사용
보안을 위한 사용자_ID를 굉장히 길고 복잡하게 만드는 경우도 있는 어짜피 ssh나 sftp 사용 시 사용자_ID를 등록해 놓기 때문에 길고 복잡한 사용자_ID가 불편하지는 않음
특정 사용자_ID에게 임시로 root 권한을 부여하는 것은 아래 명령으로 가능합니다.
sudo -i
Code language: PHP (php)
이러면 사용자_ID 비밀번호를 묻는데 비밀번호를 입력하면 마치 root처럼 사용할 수 있습니다.
사용자를 root처럼 이용하기
아시다시피 sudo 기능을 사용하려면 사용자_ID 비밀번호를 다시 입력해야 합니다. 보안을 위해서이지만 매넌 비밀번호를 입력하기가 귀찮을 수 있겠죠.
보안을 조금 포기하고 편리함에 더 방점을 둔다면 sudo 사용을 위해서 비밀번호 입력하지 않아도 되도록 만들 수 있습니다.
아래 visudo 명령을 사용하면 sido 사용자 권한을 조정할 수 있습니다.
sudo visudo
또는
nano /etc/sudoers
Code language: PHP (php)
그러면 /etc/sudoers 파일을 편집할 수 있는데요. 여기에서 root에만 허용되어 있는 NOPASSWD 권한을 사용하려는 사용자_ID에도 부과합니다.
즉 User privilege specification 부분에 사용자_ID ALL=(ALL) NOPASSWD: ALL을 추가합니다. 아래와 같은 모습이 됩니다.
root ALL=(ALL) NOPASSWD: ALL
사용자_ID ALL=(ALL) NOPASSWD: ALL
Code language: PHP (php)
물론 이러한 명령어는 한번 더 비밀번호 체크 기능을 없애면서 보안이 더 낮아지는 효과가 있겠지만 사용자 입장에서는 로그인 후 매번 sudo 사용을 위해 비밀번호를 입력하는 불편함을 줄일 수는 있습니다.
편의성을 높이느냐 아니면 보안을 유지하느냐는 선택의 문제입니다.
uid와 gid를 root처럼 만든다.
다름으호 할 것은 사용자 ID와 그룹 ID를 root처럼 만드는 것입니다.
nano /etc/passwd
Code language: PHP (php)
여기 맨 위를 보면 root 설정 내용을 볼 수 있는데요. root는 uid와 gid 값이 0입니다. 일반 사용자는 값이 1000으로 책정되어 있습니다.
여기서 사용자의 uid와 gid를 root처럼 0으로 변경합니다.
root 그룹에 일반 사용자 추가
다음으로 할 것은 root 그룹에 일반 사용자 계정을 추가하는 것입니다.
nano /etc/group
Code language: PHP (php)
여기 맨위가 root 그룹을 나타내는데요. 여기서 맨위 root:x:0: 다음에 일반 사용자 계정을 추가하면 됩니다.
이어면 일반 사용자 계정으로 마치 root처럼 사용할 수 있습니다. 그러면 이제는 root를 굳이 사용할 필요가 없기 때문에 root 사용 중지시키면 됩니다.
sudo passwd -dl root
Code language: PHP (php)
참고
우분투 20.04와 PHP 8 기반 워드프레스 설치 방법
가상 서버를 운영하고픈 勇者에게 전하는 가상 서버 운영 입문 노하우 – Vultr 가상서버호스팅(VPS)를 중심으로