/etc/passwd는 7개 필드, /etc/shadow는 9개 필드다. passwd의 두 번째 필드 x는 "실제 암호는 shadow에 있다"는 표시다. UID 0은 항상 root다.
# /etc/group — 그룹 정보 (콜론 4개 필드)staff:x:1001:alice,bob# 1 2 3 4# 1.그룹명 2.그룹암호(x) 3.GID 4.그룹멤버(쉼표구분)# /etc/gshadow — 그룹 암호화 정보
⚠️ 함정: shadow의 5번째 필드가 "최대 사용 일수"이고 4번째가 "최소 변경 간격"이다. 순서를 바꿔 외우면 빈칸 채우기에서 틀린다. 또 /etc/passwd의 7번째(셸)에 /sbin/nologin이나 /bin/false가 들어가면 로그인이 차단되는 계정이라는 의미다.
shadow 2번째 필드의 $6$는 SHA-512 해시를 뜻한다. $1$은 MD5, $5$는 SHA-256, $6$는 SHA-512다. 필드가 *이나 !로 시작하면 그 계정은 비밀번호 로그인이 잠긴 상태다.
fstab의 6번째 필드는 fsck 검사 순서다. 루트 파일시스템(/)은 반드시 1, 나머지는 2, 검사 안 할 것은 0이다. 5번째 필드는 dump 백업 여부다. 이 두 숫자 필드의 의미를 혼동하기 쉽다.
마운트 옵션 defaults는 rw,suid,dev,exec,auto,nouser,async를 묶은 것이다. ro(읽기전용), noexec(실행금지), nosuid(SetUID무시), noatime(접근시간 기록 안 함, 성능↑)이 자주 쓰인다. 스왑은 옵션에 sw, 종류에 swap을 쓴다.
# 시스템 crontab/etc/crontab # 시스템 전역 cron 설정(사용자 필드 있음)/etc/cron.d/ # 추가 cron 작업 조각 파일 디렉터리/etc/cron.daily/ # 매일 실행 스크립트/etc/cron.hourly/ # 매시간 실행 스크립트/etc/cron.weekly/ # 매주 실행 스크립트/etc/cron.monthly/ # 매월 실행 스크립트/var/spool/cron/ # 사용자별 crontab 저장 위치/etc/cron.allow # cron 사용 허용 사용자 목록/etc/cron.deny # cron 사용 거부 사용자 목록
crontab 한 줄은 5개 시간 필드 + 명령으로 구성된다.
# 분 시 일 월 요일 [사용자] 명령# * * * * *# │ │ │ │ └─ 요일 (0-7, 0과 7=일요일)# │ │ │ └──── 월 (1-12)# │ │ └─────── 일 (1-31)# │ └────────── 시 (0-23)# └───────────── 분 (0-59)30 2 * * * /backup.sh # 매일 02:300 */6 * * * /check.sh # 6시간마다0 0 1 * * /monthly.sh # 매월 1일 00:00*/10 * * * * /poll.sh # 10분마다0 9 * * 1-5 /report.sh # 평일(월~금) 09:00
crontab 시간 필드 순서는 분-시-일-월-요일이다. /etc/crontab(시스템용)에는 시간 5필드 뒤에 실행 사용자 필드가 추가로 들어가지만, 사용자 개인 crontab(crontab -e)에는 사용자 필드가 없다. 이 차이가 헷갈리기 쉽다.
⚠️ 함정: */10 * * * *는 "10분마다", 10 * * * *는 "매시 10분에 한 번"이다. 슬래시(/)가 있으면 주기(every), 없으면 정시 실행이다. 요일은 0과 7이 모두 일요일이다.
# /etc/sysctl.conf 예시net.ipv4.ip_forward = 1 # IP 포워딩(라우터/NAT)net.ipv4.icmp_echo_ignore_all = 1 # ping 응답 차단kernel.hostname = server01 # 호스트명vm.swappiness = 10 # 스왑 사용 적극성fs.file-max = 100000 # 최대 파일 핸들 수# 적용 명령sysctl -p # /etc/sysctl.conf 다시 읽어 적용sysctl -a # 현재 모든 커널 파라미터 출력sysctl net.ipv4.ip_forward # 특정 값 조회sysctl -w net.ipv4.ip_forward=1 # 즉시(런타임) 설정
라우터/NAT를 만들려면 net.ipv4.ip_forward = 1을 /etc/sysctl.conf에 넣고 sysctl -p로 적용한다. sysctl -p는 "설정 파일 다시 읽기"다. echo 1 > /proc/sys/net/ipv4/ip_forward도 같은 효과지만 재부팅하면 사라진다.
# /etc/login.defs 핵심 지시어PASS_MAX_DAYS 90 # 암호 최대 사용 일수PASS_MIN_DAYS 0 # 암호 최소 변경 간격PASS_MIN_LEN 8 # 암호 최소 길이PASS_WARN_AGE 7 # 만료 경고 일수UID_MIN 1000 # 일반 사용자 UID 시작UID_MAX 60000 # 일반 사용자 UID 끝GID_MIN 1000 # 일반 그룹 GID 시작CREATE_HOME yes # 홈 디렉터리 자동 생성UMASK 022 # 기본 umask
지시어
의미
PASS_MAX_DAYS
암호 최대 사용 일수(만료까지)
PASS_MIN_DAYS
암호 변경 최소 간격
PASS_WARN_AGE
만료 전 경고 시작일
UID_MIN/UID_MAX
일반 사용자 UID 범위
login.defs는 새로 만드는 계정의 기본값을 정한다. 이미 있는 계정의 정책을 바꾸려면 chage 명령을 쓴다. 예: chage -M 60 alice(alice의 최대 사용 일수 60일로 변경). login.defs를 고쳐도 기존 사용자에는 소급 적용되지 않는다는 점이 함정이다.
/etc/hosts # IP-호스트명 정적 매핑(DNS보다 우선 조회 가능)/etc/resolv.conf # DNS 서버(nameserver) 지정/etc/nsswitch.conf # 이름 조회 순서(hosts: files dns)/etc/hostname # 시스템 호스트명/etc/host.conf # 이름 해석 순서 보조 설정/etc/services # 포트-서비스명 매핑(80=http 등)/etc/protocols # 프로토콜 번호 매핑
# /etc/resolv.confnameserver 8.8.8.8nameserver 168.126.63.1search example.comdomain example.com# /etc/hosts127.0.0.1 localhost192.168.0.10 server01 web
DNS 서버를 지정하는 파일은 /etc/resolv.conf이고, 지시어는 nameserver다. IP와 이름을 직접 매핑하는 파일은 /etc/hosts다. 둘을 혼동하기 쉽다. 조회 순서(파일 먼저냐 DNS 먼저냐)는 /etc/nsswitch.conf의 hosts: 줄에서 정한다.
# 실제 파일을 열어 필드 구조 눈에 익히기cat /etc/passwd | head -5 # 7필드 확인sudo cat /etc/shadow | head -3 # 9필드 확인 (root 권한 필요)cat /etc/group | head -5 # 4필드 확인cat /etc/fstab # 6필드 확인cat /etc/resolv.conf # nameserver 확인# 정책 확인/변경grep PASS /etc/login.defs # 암호 정책 기본값sudo chage -l alice # alice의 현재 암호 정책(있다면)# sysctl 조회sysctl net.ipv4.ip_forward
직접 cat으로 열어 실제 내용을 보면서 필드 위치를 손에 익힌다. 다음 날은 이 지식을 바탕으로 디스크·LVM·권한을 실제로 수행하는 작업형을 다룬다.