리눅스 사용자 계정 및 Sudo 권한 구성

CompTIABeginner
지금 연습하기

소개

이 실습에서는 리눅스 시스템의 보안을 강화하기 위해 사용자 계정과 sudo 권한을 관리하는 필수 기술을 배웁니다. 비밀번호 정책 강제 적용, 사용자 계정 잠금 및 해제, root 계정 보안 강화, 관리자 권한 부여 등을 직접 실습해 봅니다. 이러한 기술은 안전하고 잘 관리된 리눅스 환경을 유지해야 하는 시스템 관리자에게 가장 기본이 되는 역량입니다.

먼저 chage 명령어를 사용하여 비밀번호 만료 규칙을 설정하고, passwd 명령어로 계정 접속을 제어하는 방법부터 시작합니다. 그다음 root 사용자의 직접적인 SSH 로그인을 비활성화하여 시스템 보안을 강화합니다. 마지막으로 권한을 승격하는 두 가지 방법을 살펴봅니다. 일반적인 sudo 권한을 위해 사용자를 wheel 그룹에 추가하는 방법과, visudo 명령어를 사용하여 특정 관리 작업만 안전하게 위임할 수 있도록 세밀한 맞춤형 규칙을 생성하는 방법을 학습합니다.

이 실습은 단계별 안내를 제공하는 가이드 실습입니다. 각 단계를 주의 깊게 따라가며 실무 경험을 쌓으시기 바랍니다. 통계에 따르면 이 실습은 초급 수준이며, 완료율은 93%, 학습자 만족도는 96%입니다.

chage 를 이용한 사용자 비밀번호 정책 관리

이 단계에서는 chage 명령어를 사용하여 사용자 비밀번호 정책을 관리하는 방법을 배웁니다. 만료 날짜 설정과 같은 비밀번호 정책을 강제하는 것은 권한이 없는 사용자의 접근으로부터 계정을 보호하는 매우 중요한 보안 관행입니다. chage 명령어 ("change age"의 약자) 를 사용하면 사용자 계정의 비밀번호 노후화 정보를 확인하고 수정할 수 있습니다.

먼저 실습을 위해 testuser라는 이름의 새로운 사용자를 생성합니다. 다음 명령어를 실행하여 사용자를 추가하세요.

sudo useradd -m testuser

그다음 testuser의 비밀번호를 설정합니다. 새 비밀번호를 입력하고 확인하는 메시지가 표시됩니다. 이번 실습에서는 편의상 password를 비밀번호로 사용합니다.

sudo passwd testuser

비밀번호가 성공적으로 업데이트되었다는 메시지가 출력됩니다.

New password:
Retype new password:
passwd: password updated successfully

이제 생성한 testuser의 기본 비밀번호 노후화 설정을 확인해 보겠습니다. chage 명령어에 -l (list) 옵션을 사용합니다.

sudo chage -l testuser

출력 결과에서 현재 정책을 확인할 수 있습니다. 기본적으로 대부분의 설정은 비활성 상태이며 비밀번호는 만료되지 않도록 설정되어 있습니다.

Last password change     : <date>
Password expires     : never
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 0
Maximum number of days between password change  : 99999
Number of days of warning before password expires : 7

이제 더 엄격한 정책을 적용해 보겠습니다. 다음과 같이 계정을 구성합니다.

  • -m 7: 비밀번호를 변경한 후 최소 7 일이 지나야 다시 변경할 수 있습니다.
  • -M 90: 비밀번호는 90 일 후에 만료됩니다.
  • -W 14: 비밀번호 만료 14 일 전부터 사용자에게 경고 메시지를 보냅니다.

이 모든 설정을 단일 chage 명령어로 적용할 수 있습니다.

sudo chage -m 7 -M 90 -W 14 testuser

이제 설정을 다시 조회하여 변경 사항이 제대로 적용되었는지 확인합니다.

sudo chage -l testuser

출력 결과에 방금 설정한 새로운 정책이 반영되어 있어야 합니다.

Last password change     : <date>
Password expires     : <date + 90 days>
Password inactive     : never
Account expires      : never
Minimum number of days between password change  : 7
Maximum number of days between password change  : 90
Number of days of warning before password expires : 14

사용자의 비밀번호 상태를 빠르게 확인하는 또 다른 유용한 명령어는 passwd -S입니다. testuser에게 실행해 보겠습니다.

sudo passwd -S testuser

출력 결과에는 마지막 변경 날짜, 최소 사용 기간, 최대 사용 기간, 경고 기간을 포함한 비밀번호 상태 요약 정보가 간략하게 표시됩니다.

testuser PS <date> 7 90 14 -1

이제 사용자 계정에 대한 비밀번호 노후화 정책을 성공적으로 구성하고 확인했습니다.

passwd 를 이용한 사용자 계정 잠금 및 해제

이 단계에서는 사용자 계정을 일시적으로 잠그고 해제하는 방법을 배웁니다. 이는 직원이 장기 휴가를 가거나 계정 도용이 의심되는 경우와 같이 관리 업무에서 자주 발생하는 상황입니다. 계정을 잠그면 로그인은 차단되지만 사용자의 데이터와 설정은 그대로 보존됩니다. 이전 단계에서 생성한 testuser 계정을 사용하겠습니다.

먼저 testuser 계정을 잠급니다. passwd 명령어에 -l (lock) 옵션을 사용합니다.

sudo passwd -l testuser

다음과 같은 확인 메시지가 나타납니다.

passwd: password expiry information changed.

계정이 잠겼는지 확인하기 위해 다시 passwd -S 명령어로 상태를 점검합니다.

sudo passwd -S testuser

출력 결과의 상태 필드를 확인하세요. 비밀번호 기반 로그인이 비활성화되었음을 나타내는 L (Locked) 로 시작해야 합니다.

testuser L <date> 7 90 14 -1

계정에 접속할 수 없는지 확인하기 위해 su (substitute user) 명령어를 사용하여 testuser로 전환을 시도해 봅니다. testuser의 비밀번호를 묻는 메시지가 나타납니다.

su - testuser

비밀번호 password를 입력합니다. 잠긴 계정의 경우 로그인 시도가 실패하는 것이 정상적인 동작입니다.

Password:
su: Authentication failure

이제 계정 잠금을 해제해 보겠습니다. passwd -u (unlock) 옵션을 사용합니다.

sudo passwd -u testuser

마찬가지로 확인 메시지가 출력됩니다.

passwd: password expiry information changed.

passwd -S로 잠금 해제 상태를 확인합니다.

sudo passwd -S testuser

상태가 PS (Password Set) 로 변경되어 있어야 하며, 이는 계정이 활성화되었고 유효한 비밀번호가 설정되어 있음을 의미합니다.

testuser PS <date> 7 90 14 -1

마지막으로 다시 testuser 계정으로 전환을 시도합니다.

su - testuser

비밀번호 password를 입력합니다. 이번에는 로그인이 성공해야 하며, 명령 프롬프트가 testuser로 로그인되었음을 보여주는 형태로 바뀝니다.

Password:
testuser@<hostname>:~$

원래의 labex 사용자 세션으로 돌아가려면 exit를 입력하고 Enter 를 누릅니다.

exit

사용자 계정을 잠그고 해제하는 실습을 성공적으로 마쳤습니다.

SSH 로그인 비활성화를 통한 Root 계정 보안 강화

이 단계에서는 root 사용자의 직접적인 SSH 로그인을 차단하여 시스템 보안을 강화합니다. 원격 root 로그인을 허용하는 것은 공격자에게 권한이 매우 높은 직접적인 표적을 제공하는 것이므로 보안상 큰 위험 요소입니다. 일반 사용자로 로그인한 후 sudo를 사용하여 관리 작업을 수행하는 것이 가장 권장되는 보안 수칙입니다.

먼저 /etc/ssh/sshd_config에 위치한 SSH 데몬 설정 파일을 편집해야 합니다. nano 텍스트 편집기를 사용하여 이 파일을 수정하겠습니다. 보호된 시스템 파일이므로 sudo를 사용해야 합니다.

sudo nano /etc/ssh/sshd_config

nano 편집기 내에서 PermitRootLogin이 포함된 줄을 찾아야 합니다. Ctrl+W를 누르고 PermitRootLogin을 입력한 뒤 Enter를 눌러 검색 기능을 사용할 수 있습니다.

참고: 일부 운영체제나 특정 브라우저 환경에서는 Ctrl+W 단축키가 브라우저 단축키와 충돌할 수 있습니다. 검색 기능을 사용할 수 없는 경우, 파일을 직접 스크롤하여 설정 파일의 인증 (authentication) 섹션에 있는 PermitRootLogin 줄을 찾으시기 바랍니다.

보통 다음과 같은 줄을 찾을 수 있습니다.

#PermitRootLogin prohibit-password

또는 yes로 설정되어 있을 수도 있습니다. 여러분이 할 일은 이 줄을 PermitRootLogin no로 변경하는 것입니다. 줄 맨 앞에 # 문자가 있다면 이를 제거해야 합니다. #은 해당 줄을 주석 처리하여 비활성화하기 때문입니다. 최종 결과는 다음과 같아야 합니다.

PermitRootLogin no

변경을 마쳤으면 파일을 저장하고 nano를 종료합니다. Ctrl+X를 누르고, 변경 사항 저장 확인 메시지에서 Y를 누른 다음, 파일 이름을 확인하기 위해 Enter를 누릅니다.

새로운 설정이 적용되려면 SSH 서비스를 재시작해야 합니다. service 명령어를 사용합니다.

sudo service ssh restart

명령어가 성공적으로 실행되면 아무런 출력도 나타나지 않습니다. 서비스가 정상적으로 실행 중인지 확인하려면 상태를 점검해 봅니다.

sudo service ssh status

서비스 상태가 running으로 표시되어야 합니다.

이제 변경 사항이 제대로 작동하는지 테스트해 보겠습니다. 로컬 머신에서 root 계정으로 SSH 접속을 시도합니다 (localhost 사용). 테스트를 유효하게 만들기 위해 먼저 root 사용자의 비밀번호를 설정해야 합니다. 비밀번호는 password로 설정합니다.

sudo passwd root
New password:
Retype new password:
passwd: password updated successfully

이제 root로 SSH 접속을 시도합니다.

ssh root@localhost

접속이 즉시 거부되면서 "Permission denied" 오류가 발생해야 합니다. 이를 통해 보안 강화 설정이 올바르게 작동하고 있음을 확인할 수 있습니다.

root@localhost: Permission denied (publickey,password).

SSH 를 통한 직접적인 root 로그인을 비활성화하여 시스템 보안을 성공적으로 강화했습니다.

wheel 그룹을 통한 Sudo 권한 부여

이 단계에서는 관리자 권한을 부여하는 표준적인 방법인 특정 그룹 (일반적으로 wheel 또는 sudo) 에 사용자를 추가하는 방법을 배웁니다. 이 그룹들은 이미 sudo 권한을 갖도록 사전 구성되어 있습니다. 이 방식은 sudoers 파일에 개별 사용자 항목을 일일이 추가하는 것보다 관리하기 쉽고 확장성이 좋습니다. 계속해서 testuser 계정을 사용하겠습니다.

먼저 testuser에게 현재 sudo 권한이 없는지 확인합니다. testuser 계정으로 전환하세요. 비밀번호는 password입니다.

su - testuser

이제 testuser 권한으로 root 권한이 필요한 명령어 (예: sudo whoami) 를 실행해 봅니다. testuser의 비밀번호를 묻는 메시지가 나타납니다.

sudo whoami

비밀번호를 입력하면 명령 실행이 실패합니다. testuser가 sudoers 파일에 없다는 메시지가 표시되는데, 이는 의도된 결과입니다.

[sudo] password for testuser:
testuser is not in the sudoers file.  This incident will be reported.

이제 exit를 입력하여 labex 사용자 세션으로 돌아갑니다.

exit

다음으로 wheel 그룹의 모든 구성원에게 sudo 권한을 부여하도록 sudoers 설정을 편집해야 합니다. 이 설정을 편집하는 가장 안전한 방법은 visudo 명령어를 사용하는 것입니다. 이 명령어는 저장하기 전에 구문을 검사하여 설정 오류로 인해 시스템 접근이 차단되는 것을 방지해 줍니다.

sudo visudo

그러면 텍스트 편집기 (보통 vi 또는 nano) 에서 /etc/sudoers 파일이 열립니다. %wheel 그룹을 언급하는 줄을 찾으세요. 아마도 # 문자로 주석 처리되어 있을 것입니다.

## %wheel ALL=(ALL) ALL

또는

## %wheel ALL=(ALL:ALL) ALL

줄 맨 앞의 #을 삭제하여 주석을 해제해야 합니다. 결과는 다음과 같아야 합니다.

%wheel ALL=(ALL) ALL

vi 편집기를 사용 중이라면 화살표 키로 # 위치로 이동한 뒤 x를 눌러 삭제하고, :wq를 입력한 후 Enter를 눌러 저장하고 종료합니다. nano 편집기라면 단순히 #을 지우고 Ctrl+X, Y, Enter를 차례로 누릅니다.

이제 wheel 그룹에 권한이 부여되었으므로 testuser를 해당 그룹에 추가합니다. usermod 명령어에 -aG 옵션을 사용합니다. 여기서 -a는 추가 (append) 를 의미하고 -G는 보조 그룹을 지정합니다.

sudo usermod -aG wheel testuser

testuserwheel 그룹의 구성원이 되었는지 확인하기 위해 groups 명령어를 사용합니다.

groups testuser

출력 결과의 그룹 목록에 wheel이 포함되어 있어야 합니다.

testuser : testuser wheel

마지막으로 새로운 권한이 작동하는지 테스트합니다. 다시 testuser로 전환합니다.

su - testuser

sudo 명령어를 다시 실행해 봅니다. 메시지가 나타나면 password를 입력합니다.

sudo whoami

이번에는 명령어가 성공적으로 실행되어 root라고 출력되어야 합니다. 이는 testuser가 이제 sudo 권한을 가졌음을 증명합니다.

[sudo] password for testuser:
root

exit를 입력하여 labex 세션으로 돌아옵니다. 사용자를 wheel 그룹에 추가하여 sudo 권한을 성공적으로 부여했습니다.

visudo 를 이용한 맞춤형 Sudo 규칙 생성

이 단계에서는 광범위한 그룹 기반 권한을 넘어 세밀한 sudo 규칙을 만드는 방법을 배웁니다. 이는 사용자가 업무 수행에 꼭 필요한 권한만 갖도록 하는 '최소 권한 원칙'을 구현하는 데 필수적입니다. sudoers 파일 내에서 별칭 (Alias) 을 사용하여 사용자 집합과 명령어 집합을 정의하고, 이를 하나의 규칙으로 연결해 보겠습니다.

먼저 규칙을 테스트할 상황을 만듭니다. root 사용자로 프로세스를 하나 시작합니다. 간단한 프로세스 모니터인 top 명령어가 적당합니다. sudo를 사용하여 백그라운드에서 실행하겠습니다. 시작하기 전에 다른 top 프로세스가 실행 중이지 않은지 확인합니다.

pgrep top || echo "No top processes running"
sudo top &

백그라운드 작업의 프로세스 ID(PID) 가 표시됩니다. 프롬프트가 바로 나타나지 않으면 Enter를 누르세요.

[1] <PID>

이제 맞춤형 규칙을 생성합니다. testuser에게 killpkill 명령어를 사용하여 프로세스를 종료할 수 있는 특정 권한을 부여할 것입니다. visudo 명령어를 사용하여 sudoers 파일을 엽니다. 이 파일을 편집하는 유일하고 안전한 방법입니다.

sudo visudo

편집기에서 /etc/sudoers 파일이 열리면 파일의 맨 끝으로 이동합니다. 다음 내용들을 추가하여 명령어 별칭과 사용자 별칭을 정의하고, 이들을 연결하는 규칙을 만듭니다.

## Custom rule for junior administrators
Cmnd_Alias      KILL_CMDS = /usr/bin/kill, /usr/bin/pkill
User_Alias      JUNIOR_ADMINS = testuser

JUNIOR_ADMINS   ALL=(ALL) KILL_CMDS

각 줄의 의미는 다음과 같습니다.

  • Cmnd_Alias: 명령어 목록에 이름을 붙여 정의합니다. 여기서는 KILL_CMDS라고 이름 지었습니다. 명령어의 전체 경로를 사용해야 함에 유의하세요.
  • User_Alias: 사용자 목록에 이름을 붙여 정의합니다. 여기서는 JUNIOR_ADMINS라고 이름 지었습니다.
  • 마지막 줄은 실제 규칙입니다. JUNIOR_ADMINS에 속한 사용자가 모든 호스트 (ALL) 에서 KILL_CMDS에 정의된 명령어를 실행할 수 있도록 허용합니다.

내용을 추가한 후 파일을 저장하고 편집기를 종료합니다.

이 특정 규칙을 정확히 테스트하려면, 이전 단계에서 부여했던 전체 sudo 권한을 회수하기 위해 testuserwheel 그룹에서 제거해야 합니다. 그래야 테스트 결과가 유효합니다.

sudo gpasswd -d testuser wheel

확인 메시지가 나타납니다.

Removing user testuser from group wheel

이제 제한된 새로운 권한을 테스트해 보겠습니다. testuser 계정으로 전환합니다. 비밀번호는 password입니다.

su - testuser

먼저 전체 sudo 권한이 사라졌는지 확인합니다. KILL_CMDS 별칭에 포함되지 않은 whoami와 같은 명령어를 실행해 봅니다.

sudo whoami

이 시도는 testuser가 해당 명령어를 실행할 권한이 없다는 메시지와 함께 실패해야 합니다.

[sudo] password for testuser:
Sorry, user testuser is not allowed to execute '/usr/bin/whoami' as root on <hostname>.

다음으로 허용된 명령어를 실행해 봅니다. 아까 시작한 top 프로세스를 중지하기 위해 pkill을 사용합니다. root 권한으로 실행 중인 top 프로세스를 특정하여 종료하기 위해 pkill -u root top을 사용하겠습니다.

sudo pkill -u root top

이 명령어는 오류 메시지 없이 성공적으로 실행되어야 합니다. top 프로세스가 종료되었는지 확인하기 위해 exitlabex 사용자로 돌아가서 프로세스를 확인합니다.

exit

이제 top 프로세스가 여전히 실행 중인지 확인합니다.

pgrep -u root top

아무런 출력도 나오지 않아야 하며, 이는 testuser에 의해 프로세스가 성공적으로 종료되었음을 의미합니다. 이제 세밀한 sudo 규칙을 성공적으로 생성하고 테스트했습니다.

요약

이 실습에서는 리눅스 환경에서 사용자 계정과 보안 정책을 관리하는 필수 기술을 학습했습니다. chage 명령어를 사용하여 비밀번호 최소/최대 사용 기간 및 경고 기간 설정과 같은 비밀번호 노후화 규칙을 강제 적용해 보았습니다. 또한 passwd 명령어를 사용하여 로그인 접근을 제어하기 위해 사용자 계정을 잠그고 해제하는 방법도 배웠습니다. 시스템 보안을 강화하기 위해 SSH 데몬 설정을 수정하여 가장 높은 권한을 가진 root 계정의 직접 로그인을 차단하는 핵심 보안 수칙을 실천했습니다.

더불어 sudo를 사용하여 관리자 권한을 안전하게 위임하는 방법들을 살펴보았습니다. usermod 명령어로 사용자를 wheel 그룹에 추가하여 전체 sudo 권한을 부여하는 표준적인 관행을 익혔습니다. 더욱 정교한 제어를 위해 visudo 명령어로 sudoers 파일을 안전하게 편집하여, 특정 사용자가 root 비밀번호 없이 지정된 명령어만 실행할 수 있도록 하는 맞춤형 규칙을 생성했습니다. 이러한 접근 방식은 사용자에게 업무에 필요한 최소한의 권한만 부여하는 '최소 권한 원칙'을 실현할 수 있게 해줍니다.