useradd, usermod, userdel 을 활용한 리눅스 사용자 계정 관리

CompTIABeginner
지금 연습하기

소개

이 실습에서는 리눅스 시스템에서 사용자 계정을 관리하는 데 필수적인 기술을 습득합니다. 새로운 계정을 생성하고 보안을 설정하는 것부터 속성을 수정하고, 마지막으로 안전하게 삭제하는 것까지 사용자 관리의 전체 과정을 직접 실습해 봅니다. 이러한 실무 경험은 다중 사용자 리눅스 환경을 유지 관리해야 하는 시스템 관리자에게 가장 기본이 되는 역량입니다.

먼저 useradd 명령어를 사용하여 새로운 사용자와 홈 디렉토리를 생성한 다음, passwd로 계정 보안을 설정하는 것으로 시작합니다. 이어서 사용자 전환 시 susu -의 차이점을 살펴보고, 계정을 잠그거나 잠금 해제하는 방법을 배웁니다. 또한 chage를 이용한 비밀번호 만료 정책 설정과 usermod를 이용한 그룹 멤버십 관리 등 사용자 속성을 수정하는 방법도 다룹니다. 마지막으로 userdel 명령어를 사용하여 사용자와 관련 데이터를 올바르게 제거하는 방법을 확인하며 실습을 마무리합니다.

useraddpasswd 를 이용한 사용자 생성 및 보안 설정

이 단계에서는 useradd 명령어를 사용하여 새로운 사용자 계정을 생성하고, passwd 명령어로 비밀번호를 설정하여 계정 보안을 강화하는 방법을 배웁니다. 이는 리눅스 시스템 관리의 가장 기본적인 작업입니다.

먼저 student1이라는 이름의 새로운 사용자를 생성해 보겠습니다. useradd 명령어는 사용자를 생성하기 위해 루트 권한이 필요하므로 명령어 앞에 sudo를 붙여야 합니다.

터미널에서 다음 명령어를 실행하세요:

sudo useradd -m student1

-m 옵션은 매우 중요합니다. 이 옵션은 useradd가 사용자의 홈 디렉토리를 생성하도록 지시하며, 기본적으로 /home/student1에 생성됩니다. -m 옵션을 사용하지 않으면 사용자는 생성되지만 파일을 저장할 개인 홈 디렉토리가 만들어지지 않습니다.

명령어를 실행하면 시스템은 몇 가지 중요한 시스템 파일에 새 사용자에 대한 항목을 생성합니다. grep 명령어를 사용하여 /etc/passwd, /etc/shadow, /etc/group 파일에서 student1으로 시작하는 줄을 검색하여 이를 확인할 수 있습니다. /etc/shadow 파일은 읽기 위해 루트 권한이 필요하므로 sudo를 사용해야 합니다.

sudo grep ^student1 /etc/passwd /etc/shadow /etc/group

출력 결과는 다음과 유사할 것입니다. 사용자 ID(UID) 와 그룹 ID(GID) 번호는 다를 수 있지만 구조는 동일합니다.

/etc/passwd:student1:x:5001:5001::/home/student1:/bin/sh
/etc/shadow:student1:!:20265:0:99999:7:::
/etc/group:student1:x:5001:

출력 내용을 분석해 보겠습니다:

  • /etc/passwd: 이 파일은 기본적인 사용자 계정 정보를 담고 있습니다. 두 번째 필드의 x는 암호화된 비밀번호가 여기에 저장되지 않고 보안을 위해 /etc/shadow 파일에 저장됨을 나타냅니다.
  • /etc/shadow: 이 파일은 보안이 강화된 사용자 계정 정보를 담고 있습니다. 두 번째 필드는 처음에 ! 또는 *로 표시되는데, 이는 아직 비밀번호가 설정되지 않았으며 해당 계정으로 로그인할 수 없음을 의미합니다.
  • /etc/group: 해당 사용자의 기본 그룹으로 사용될 student1이라는 이름의 새 그룹이 자동으로 생성되었습니다.

이제 사용자가 생성되었으므로 계정을 사용 가능하고 안전하게 만들기 위해 비밀번호를 설정해야 합니다. 이를 위해 passwd 명령어를 사용합니다. useradd와 마찬가지로 다른 사용자의 비밀번호를 변경할 때는 sudo가 필요합니다.

sudo passwd student1

시스템에서 student1의 새 비밀번호를 입력하고 다시 입력하라는 메시지가 표시됩니다. 이 실습에서는 비밀번호로 student1pass를 사용해 주세요. 보안상의 이유로 입력하는 동안 화면에는 아무런 글자도 표시되지 않습니다.

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

비밀번호가 설정되었으므로 /etc/shadow 파일을 다시 확인하여 무엇이 변경되었는지 살펴보겠습니다.

sudo grep ^student1 /etc/shadow

이제 출력이 달라졌을 것입니다. ... 부분은 길고 고유한 문자열을 나타냅니다.

student1:$y$j9T$lUM1RtLPQdrCOHmaFf1po/$xqNw.5dz54yR9whxsID9teI28/BOyvKocK5dA9X7GoD:20265:0:99999:7:::

두 번째 필드에 길고 복잡한 문자열이 포함된 것을 확인할 수 있습니다. 이것은 방금 설정한 비밀번호의 해시 (암호화) 버전입니다. 이제 계정이 활성화되었으며 로그인이 가능합니다.

susu -를 통한 사용자 전환 및 환경 차이 이해

이 단계에서는 su(substitute user) 명령어를 사용하여 현재 터미널 세션 내에서 다른 사용자 계정으로 전환하는 방법을 알아봅니다. 또한 -(또는 --login) 플래그 사용 여부에 따른 결정적인 차이점을 배우게 되는데, 이는 사용자 환경에 큰 영향을 미칩니다.

먼저 labex 사용자로 현재 환경을 확인해 보겠습니다. 다음 명령어들을 실행하여 현재 사용자, 홈 디렉토리, 작업 디렉토리를 확인하세요.

whoami
echo $HOME
pwd

프로젝트 디렉토리에 있는 labex 사용자임을 확인하는 다음과 같은 출력이 표시됩니다.

labex
/home/labex
/home/labex/project

이제 이전 단계에서 생성한 student1 사용자로 전환해 보겠습니다. su 명령어 뒤에 사용자 이름을 입력합니다. student1의 비밀번호 (student1pass) 를 묻는 메시지가 나타납니다.

su student1

비밀번호를 입력하면 이제 세션이 student1의 권한으로 작동합니다. 하지만 환경 설정이 완전히 로드되지는 않았습니다. 동일한 명령어들을 다시 실행하여 무엇이 바뀌고 무엇이 그대로인지 확인해 봅시다.

whoami
echo $HOME
pwd

출력 결과는 다음과 같습니다:

student1
/home/student1
/home/labex/project

이 결과가 의미하는 바는 다음과 같습니다:

  • whoami: 현재 실질적으로 student1입니다.
  • echo $HOME: HOME 환경 변수가 이제 새 사용자 (student1) 의 홈 디렉토리를 가리킵니다.
  • pwd: 사용자 전환 전과 동일한 디렉토리 (/home/labex/project) 에 머물러 있습니다.

이러한 동작은 문제가 될 수 있습니다. 스크립트나 애플리케이션이 설정 파일을 찾기 위해 HOME 변수나 현재 경로에 의존할 경우 예상치 못한 동작이 발생할 수 있기 때문입니다.

이제 exit를 입력하여 labex 사용자의 쉘로 돌아갑니다.

exit

다음으로 다시 사용자 전환을 시도하되, 이번에는 - 플래그를 사용해 보겠습니다. 이 플래그는 su가 로그인 쉘을 시작하도록 지시하며, 이는 새 사용자로 완전히 로그인한 것과 같은 상태를 시뮬레이션합니다. 즉, 홈 디렉토리와 쉘 프로필을 포함한 student1의 전체 환경을 로드합니다.

su - student1

비밀번호 (student1pass) 를 다시 입력합니다. 이제 동일한 진단 명령어들을 실행해 보세요:

whoami
echo $HOME
pwd

이전 시도와 출력을 비교해 보십시오:

student1
/home/student1
/home/student1

차이점이 명확합니다:

  • whoami: 여전히 student1입니다.
  • echo $HOME: HOME 변수가 /home/student1을 가리킵니다.
  • pwd: 현재 작업 디렉토리가 student1의 홈 디렉토리로 변경되었습니다.

이것은 커맨드 라인에서 사용자를 전환할 때 su - <username> 형식을 사용하는 것이 권장되는 이유를 보여줍니다. 새 사용자에게 깨끗하고 예측 가능한 환경을 제공하여 잘못된 경로 및 권한 문제를 방지할 수 있기 때문입니다.

이 단계를 마치려면 exit를 입력하여 원래의 labex 세션으로 돌아갑니다.

exit

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

이 단계에서는 사용자 계정을 잠가서 일시적으로 비활성화하고, 다시 잠금을 해제하여 활성화하는 방법을 배웁니다. 이는 계정과 파일을 삭제하지 않고 사용자의 로그인을 차단해야 하는 상황에서 자주 사용되는 관리 기법입니다.

먼저 student1 계정을 잠가 보겠습니다. 이를 위해 passwd 명령어에 -l(lock) 옵션을 사용합니다. 이 작업은 관리자 권한이 필요하므로 sudo를 사용해야 합니다.

sudo passwd -l student1

명령어가 실행되면 비밀번호가 잠겼다는 확인 메시지가 나타납니다.

passwd: password for user student1 changed.

그렇다면 "잠금"은 실제로 어떤 역할을 할까요? 효과를 확인하기 위해 /etc/shadow 파일을 다시 조사해 보겠습니다.

sudo grep ^student1 /etc/shadow

미세하지만 중요한 변화를 발견할 수 있습니다. 암호화된 비밀번호 문자열 앞에 하나 또는 두 개의 느낌표 (!) 가 붙어 있습니다.

student1:!$y$j9T$...:20265:0:99999:7:::

! 접두사는 저장된 비밀번호 해시를 무효화하여 사용자가 제공하는 어떤 비밀번호와도 일치하지 않게 만듭니다. 결과적으로 사용자는 로그인할 수 없게 됩니다. 이를 테스트해 봅시다. student1 사용자로 전환을 시도해 보세요:

su - student1

비밀번호를 묻는 메시지가 나타나지만, 정확한 비밀번호 (student1pass) 를 입력하더라도 로그인이 실패합니다.

Password:
su: Authentication failure

계정이 성공적으로 잠겼음을 확인했습니다. 이제 잠금을 해제해 보겠습니다. 계정을 다시 활성화하려면 passwd 명령어에 -u(unlock) 옵션을 사용하여 과정을 되돌리면 됩니다.

sudo passwd -u student1

마찬가지로 변경 사항에 대한 확인 메시지가 나타납니다.

passwd: password for user student1 changed.

계정이 해제되었는지 확인하기 위해 /etc/shadow 파일을 마지막으로 한 번 더 확인합니다.

sudo grep ^student1 /etc/shadow

출력을 보면 ! 접두사가 제거되어 원래의 비밀번호 해시가 복구된 것을 볼 수 있습니다.

student1:$y$j9T$...:20265:0:99999:7:::

이제 계정이 다시 활성화되었습니다. student1 사용자로 성공적으로 전환되는지 확인해 보세요. 메시지가 나타나면 비밀번호 student1pass를 입력합니다.

su - student1

이제 student1으로 로그인되었을 것입니다. 마지막으로 exit를 입력하여 labex 세션으로 돌아갑니다.

exit

chageusermod 를 이용한 비밀번호 만료 및 그룹 멤버십 수정

이 단계에서는 더 고급 사용자 속성을 관리합니다. chage를 사용하여 비밀번호 만료를 제어함으로써 비밀번호 보안 정책을 강제하는 방법과, usermod를 사용하여 사용자의 그룹 멤버십을 관리함으로써 권한 및 액세스 권한을 제어하는 방법을 배웁니다.

먼저 student1 계정의 비밀번호 만료 정보를 살펴보겠습니다. chage(change age) 명령어에 -l(list) 플래그를 사용하면 상세 내용을 볼 수 있습니다.

sudo chage -l student1

출력 결과에는 계정의 기본 설정이 표시됩니다. 날짜는 사용자를 생성한 시점에 따라 달라집니다.

Last password change     : Dec 08, 2024
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

보안을 위해 사용자가 주기적으로 비밀번호를 변경하도록 요구하는 것이 좋습니다. 비밀번호를 90 일마다 변경해야 하고 (-M 90), 최소 7 일에 한 번만 변경할 수 있으며 (-m 7), 만료 14 일 전에 경고를 받도록 (-W 14) 정책을 설정해 보겠습니다.

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

이제 설정을 다시 확인하여 변경 사항을 확인합니다:

sudo chage -l student1

출력에 새로운 정책이 반영된 것을 볼 수 있습니다:

Last password change     : Dec 08, 2024
Password expires     : Mar 08, 2025
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

다음으로 그룹 멤버십을 수정해 보겠습니다. 사용자는 하나의 기본 그룹에 속하며, 여러 개의 보조 (또는 추가) 그룹에 속할 수 있습니다. id 명령어로 사용자의 그룹을 확인할 수 있습니다.

id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1)

이는 student1의 기본 그룹이 student1(gid=5001) 이며 아직 보조 그룹에는 속해 있지 않음을 보여줍니다.

developers라는 새 그룹을 만들고 student1을 여기에 추가해 보겠습니다. 먼저 그룹을 생성합니다:

sudo groupadd developers

이제 usermod를 사용하여 student1을 이 새 그룹에 추가합니다. -aG 플래그가 매우 중요합니다. -G는 보조 그룹을 지정하고, -a는 사용자를 다른 그룹에서 제거하지 않고 해당 그룹에 추가 (append) 하도록 합니다.

sudo usermod -aG developers student1

사용자의 그룹을 다시 확인합니다:

id student1

출력에 developers 그룹이 포함되었습니다:

uid=5001(student1) gid=5001(student1) groups=5001(student1),1002(developers)

만약 -a 플래그를 잊어버리면 어떻게 될까요? testers라는 또 다른 그룹을 만들고 -G만 사용하여 student1을 추가해 보겠습니다.

sudo groupadd testers
sudo usermod -G testers student1

이제 그룹을 다시 한 번 확인해 보세요:

id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1),1003(testers)

student1이 더 이상 developers 그룹에 속해 있지 않음을 알 수 있습니다. -a 없이 usermod -G를 사용하면 기존의 모든 보조 그룹을 새 목록으로 교체해 버립니다. 사용자를 두 그룹 모두에 포함시키려면 모든 그룹을 나열하거나 (-G developers,testers) 추가 플래그를 사용해야 합니다. student1developers 그룹에 다시 올바르게 추가하여 이를 수정해 봅시다.

sudo usermod -aG developers student1

최종 상태를 확인합니다. 사용자는 이제 두 그룹 모두의 구성원이어야 합니다.

id student1
uid=5001(student1) gid=5001(student1) groups=5001(student1),1003(testers),1002(developers)

userdeluserdel -r을 이용한 사용자 및 데이터 삭제

이 단계에서는 userdel 명령어를 사용하여 시스템에서 사용자 계정을 영구적으로 제거하는 방법을 배웁니다. 단순히 사용자의 계정 정보만 삭제하는 것과 홈 디렉토리와 같은 모든 관련 파일까지 함께 삭제하는 것의 중요한 차이점을 확인하게 됩니다.

먼저 두 가지 삭제 방법을 모두 시연하기 위해 student2라는 두 번째 사용자를 생성해 보겠습니다.

sudo useradd -m student2

이제 작업할 두 명의 사용자 (student1과 새 사용자 student2) 가 준비되었습니다.

특별한 옵션 없이 student1 사용자를 삭제하는 것부터 시작해 보겠습니다. 기본 userdel 명령어는 /etc/passwd/etc/shadow와 같은 시스템 계정 파일에서 사용자의 항목을 제거하지만, 홈 디렉토리는 삭제하지 않습니다. 이는 사용자를 완전히 제거하기 전에 데이터를 보관해야 할 때 유용할 수 있습니다.

sudo userdel student1

사용자 계정이 사라졌는지 확인하기 위해 /etc/passwd에서 해당 사용자를 grep으로 검색해 봅니다.

grep ^student1 /etc/passwd

이 명령어는 아무런 출력도 내놓지 않아야 하며, 이는 사용자 계정 항목이 삭제되었음을 확인해 줍니다. 하지만 홈 디렉토리는 어떻게 되었을까요? /home/student1이 여전히 존재하는지 확인해 봅시다.

ls -ld /home/student1

디렉토리가 여전히 존재함을 확인할 수 있습니다. 다만 시스템이 더 이상 해당 ID 를 사용자 이름으로 매핑할 수 없기 때문에 소유자가 숫자로 (사용자의 이전 UID) 표시됩니다.

drwxr-x--- 2 5001 5001 78 Jun 26 08:18 /home/student1

이제 student2 사용자를 삭제하되, 이번에는 -r(remove) 플래그를 사용해 보겠습니다. 이 옵션은 userdel에게 계정 항목뿐만 아니라 사용자의 홈 디렉토리와 메일 스풀까지 모두 제거하도록 지시합니다. 이는 완전하고 되돌릴 수 없는 삭제 방식입니다.

sudo userdel -r student2

메일 스풀을 찾을 수 없다는 경고 메시지가 나타날 수 있는데, 이는 해당 사용자가 메일을 받은 적이 없기 때문에 발생하는 정상적인 현상입니다.

userdel: student2 mail spool (/var/mail/student2) not found

이 경고는 오류가 아닙니다. 단지 삭제할 메일 스풀 파일이 없다는 의미일 뿐이며, 메일을 받은 적이 없는 신규 사용자에게는 당연한 결과입니다.

먼저 /etc/passwd에서 계정 항목이 사라졌는지 확인합니다. 이전과 마찬가지로 아무런 출력도 나오지 않아야 합니다.

grep ^student2 /etc/passwd

다음으로 가장 중요한 단계인 홈 디렉토리 /home/student2의 존재 여부를 확인합니다.

ls -ld /home/student2

이번에는 명령어가 오류 메시지와 함께 실패하며, 이는 사용자 계정과 함께 디렉토리가 완전히 제거되었음을 증명합니다.

ls: cannot access '/home/student2': No such file or directory

이제 필요에 따라 사용자 데이터를 보존하거나 영구적으로 삭제할 수 있는 두 가지 사용자 삭제 방법을 모두 익혔습니다.

요약

이 실습에서는 리눅스 시스템에서 사용자 계정을 관리하기 위한 핵심 명령어들을 학습했습니다. useradd -m으로 홈 디렉토리를 포함한 새 사용자를 생성하고, passwd로 비밀번호를 설정하여 계정 보안을 강화하는 방법부터 시작했습니다. susu -를 모두 사용하여 사용자 전환을 연습하며 표준 쉘과 로그인 쉘 환경의 결정적인 차이점을 배웠습니다. 또한 passwd 명령어의 -l-u 옵션을 사용하여 계정 액세스를 잠그고 해제하는 관리 방법도 익혔습니다.

이어서 기존 사용자 속성을 수정하는 과정을 진행했습니다. chage를 사용하여 비밀번호 만료 정책을 관리하고, usermod를 사용하여 사용자의 그룹 멤버십을 변경해 보았습니다. 마지막으로 시스템에서 사용자를 제거하는 과정을 살펴보며, 사용자 계정만 삭제하는 userdel 명령어와 완전한 정리를 위해 홈 디렉토리 및 메일 스풀까지 삭제하는 userdel -r 명령어의 차이점을 확인했습니다.