정보보안기사 실기 재도전 02 — 유닉스·리눅스 보안 (계정·패스워드·권한·로그·원격접속)
출제기준 주요항목 1. 시스템·네트워크 보안특성 파악 (1-1 운영체제별) / 2. 취약점 점검·보완 (2-1 운영체제)
실기에서 가장 자주 나오는 영역: 로그 파일, passwd/shadow, PAM, SUID, r-command, xinetd를 한 편에 정리합니다.
이번 편 출제 맵 ⭐⭐⭐
| 주제 | 출제 회차 (예시) | 유형 |
| 로그 파일·로그 확인 명령 | 1·6·14·22·27·28·29회 | 단답·실무 |
| /etc/passwd, /etc/shadow | 14·16·22·29·30·31회 | 단답·실무 |
| PAM·계정 잠금 | 14·18·23·29회 | 단답·서술 |
| 패스워드 정책 | 13·24·26회 | 단답·실무 |
| SUID/SGID | 1·8·11·19·24·32회 | 단답·서술·실무 |
| r-command | 24·32회 | 서술·실무 |
| xinetd 설정 | 9·24·30회 | 실무 |
| cron | 7·8회 | 서술 |
| 배너 노출 | 28회 | 서술 |
| 서버 설정 빈칸 채우기 | 30회 | 실무 |
(회차는 기출 파일 키워드 검색 기준 예시입니다. 전부 나열한 것은 아니에요.)
1. 로그 파일 ⭐⭐⭐
| 파일 | 내용 | 확인 명령 |
| /var/run/utmp (또는 /var/adm/utmp) | 현재 로그인 사용자 | who, w, users |
| /var/log/wtmp | 로그인·로그아웃 이력, 재부팅 | last |
| /var/log/btmp | 로그인 실패 기록 | lastb |
| /var/log/lastlog | 사용자별 최근 로그인 시간 | lastlog |
| pacct | 사용자가 실행한 명령 기록(프로세스 어카운팅) | lastcomm (기록 시작: accton) |
| sulog (Solaris) | su 사용 기록 (+ 성공, − 실패) | cat /var/adm/sulog |
| loginlog (Solaris) | 로그인 5회 이상 연속 실패 기록 | cat /var/adm/loginlog |
| /var/log/secure | Linux su·ssh 인증 기록 (Debian 계열은 auth.log) | |
| xferlog | FTP 전송 기록 | |
| messages | 시스템 전반 | |
| cron | cron 실행 | |
| maillog | 메일 | |
| boot.log / dmesg | 부팅 메시지 | dmesg |
| ~/.bash_history | 사용자 명령 이력 | history |
단답 키워드: utmp=현재 / wtmp=이력 / btmp=실패 / lastlog=최근 로그인 / pacct=명령 / sulog=su
⚠️ wtmp(로그인 이력)와 btmp(실패)를 혼동하지 마세요. last = wtmp, lastb = btmp.
⚠️ pacct는 accton으로 켜야 기록됩니다. 확인은 lastcomm.
2. 계정·패스워드 ⭐⭐⭐
2-1. /etc/passwd (7개 필드)
exam:x:1000:1000:Exam User:/home/exam:/bin/bash
① ② ③ ④ ⑤ ⑥ ⑦
① 계정명 ② 패스워드(x = shadow 사용) ③ UID ④ GID ⑤ 설명(GECOS) ⑥ 홈 디렉터리 ⑦ 로그인 셸
22회 3번처럼 5번째 필드(GECOS)가 비어 있거나 생략된 예시가 나오면 필드를 세어서 "1000 = GID, /home/exam = 홈, /bin/bash = 셸"로 읽습니다. 콜론 개수로 위치를 세는 습관이 필요해요.
2-2. /etc/shadow (9개 필드)
root:$6$salt$hash:17132:0:99999:7:::
① ② ③ ④ ⑤ ⑥ ⑦⑧⑨
① 계정명 ② 암호화된 패스워드 ③ 마지막 변경일(1970-01-01 기준 일수)
④ 최소 사용 기간 ⑤ 최대 사용 기간 ⑥ 만료 경고 기간 ⑦ 비활성 기간 ⑧ 계정 만료일 ⑨ 예약
- 17132 = 2016-11-27 (1970-01-01 + 17132일)
- 4번 0 = 변경 제한 없음, 5번 99999 = 사실상 무제한, 6번 7 = 7일 전부터 경고
- 패스워드 필드가
!또는*= 로그인 불가 계정
| 접두 | 알고리즘 |
|---|---|
| 접두 | 알고리즘 |
| $1$ | MD5 |
| $2a$ / $2y$ | bcrypt |
| $5$ | SHA-256 |
| $6$ | SHA-512 |
| $y$ | yescrypt |
pwconv는 passwd → shadow 분리 적용, pwunconv는 shadow를 passwd로 되돌립니다.
2-3. 패스워드 정책 (OS별 설정 파일) ⭐⭐
| OS | 최소 길이 | 최대 사용 기간 |
| Linux | /etc/login.defs PASS_MIN_LEN 8 |
PASS_MAX_DAYS 90 |
| Solaris | /etc/default/passwd PASSLENGTH=8 |
MAXWEEKS=12 |
| AIX | /etc/security/user minlen=8 |
maxage=12 |
| HP-UX | /etc/default/security MIN_PASSWORD_LENGTH=8 |
PASSWORD_MAXDAYS=90 |
그 밖에 Linux PASS_MIN_DAYS 1(최소 사용 기간), PASS_WARN_AGE 7(경고 일수).
⚠️ 최신 배포판에서는 PASS_MIN_LEN이 더 이상 쓰이지 않고 PAM(pam_pwquality의 minlen)이 길이를 정합니다.
시험은 교재 기준(login.defs)으로 답하되, 실무에서는 PAM 설정을 확인하세요.
2-4. PAM과 계정 잠금 ⭐⭐⭐
PAM 모듈 타입 4가지: auth(인증) / account(계정 상태) / password(패스워드 변경) / session(세션)
교재·기출에 나오는 계정 잠금 예시:
auth required pam_tally.so deny=5 unlock_time=120 no_magic_root
account required pam_tally.so no_magic_root reset
- deny=5 → 5회 실패 시 잠금, unlock_time=120 → 120초 후 해제
- 교재 설명: no_magic_root = root에는 잠금 미적용, reset = 로그인 성공 시 실패 횟수 초기화
⚠️ 해설이 갈리는 부분입니다.
- 교재: no_magic_root = root 잠금 제외
- 14회 복원 해설: root도 적용된다고 설명
- 실제 Linux-PAM 소스(1.3.1)에는 no_magic_root·reset 옵션이 없고(알 수 없는 옵션은 로그만 남김),
pam_tally/pam_tally2는 1.5.0 시기에 제거됨 → 현재는 pam_faillock
시험 답안은 교재 설명을 따르고, 실무에서는 아래 faillock을 쓰세요.
현재 방식 (pam_faillock):
/etc/security/faillock.conf
deny = 5
fail_interval = 900
unlock_time = 600
even_deny_root # root에도 적용
faillock --user 계정 # 실패 기록 확인
faillock --user 계정 --reset # 초기화
2-5. 기타 계정 보안
- 불필요 계정(lp, uucp, nuucp 등) 삭제 또는 로그인 셸을 /sbin/nologin으로
- root 원격 로그인 제한
| OS | 설정 |
| Solaris | /etc/default/login CONSOLE=/dev/console |
| Linux | /etc/securetty + pam_securetty, sshd_config PermitRootLogin no |
| AIX | /etc/security/user rlogin=false |
| HP-UX | /etc/securetty console |
- su 제한: wheel 그룹만 su 허용 (
pam_wheel.so use_uid), Solaris는chgrp security su; chmod 4750 su - 세션 타임아웃: /etc/profile 에
TMOUT=600
3. 파일·디렉터리 권한 ⭐⭐⭐
3-1. 권한 기준표
| 파일 | 권한 | 소유자 |
|---|---|---|
| 파일 | 권한 | 소유자 |
| /etc/passwd | 644 | root |
| /etc/shadow | 400 | root |
| /etc/hosts | 600 | root |
| /etc/(x)inetd.conf | 600 | root |
| /etc/syslog.conf | 644 | root |
| /etc/services | 644 | root |
3-2. umask ⭐⭐
umask는 빼기가 아니라 비트 마스크입니다.
파일 기본 666, 디렉터리 기본 777에서 umask 비트를 제거합니다.
umask 022: 파일 644 / 디렉터리 755
umask 027: 파일 640 / 디렉터리 750 (637 아님!)
umask 033: 파일 644 / 디렉터리 744 (633 아님!)
umask 077: 파일 600 / 디렉터리 700
⚠️ 단순히 666 − 027 = 637 로 계산하면 틀립니다. 6(110)에서 2(010)를 지우면 4, 7을 지우면 0 → 비트로 계산하세요.
3-3. SUID / SGID / Sticky ⭐⭐⭐
| 특수권한 | 숫자 | 의미 |
| SUID | 4000 | 실행 시 파일 소유자 권한으로 실행 (rws) |
| SGID | 2000 | 실행 시 파일 그룹 권한으로 실행 / 디렉터리면 그룹 상속 |
| Sticky | 1000 | 디렉터리 안 파일은 소유자만 삭제 (/tmp) |
find / -perm -4000 2>/dev/null # SUID
find / -perm -2000 2>/dev/null # SGID
find / \( -perm -4000 -o -perm -2000 \) 2>/dev/null # 둘 중 하나
find / -perm -2 -type f 2>/dev/null # 다른 사용자 쓰기 가능(world-writable)
find / -nouser -o -nogroup 2>/dev/null # 소유자·그룹 없는 파일
find / -mtime -10 # 최근 10일 내 수정
chmod -s 파일 # SUID·SGID 둘 다 제거
⚠️ chmod -s 는 SUID와 SGID를 동시에 제거합니다.
⚠️ -perm -4000 (모든 지정 비트 포함) vs -perm 4000 (정확히 일치) 구분.
3-4. 실무 패턴 — 백업 파일 권한 (15회 14번 유형)
상황: 백업 파일이 644라서 다른 사용자가 읽을 수 있음 → 원인과 조치
원인: umask가 022 → 파일이 644로 생성되어 other가 읽기 가능
조치: 스크립트에서 umask 077(또는 0177)로 설정 → 파일 600
기존 umask 저장 후 작업 끝나면 복원
chown operator 파일 ; chmod 400 파일
4. 원격접속·서비스 ⭐⭐⭐
4-1. r-command (rlogin, rsh, rexec) ⭐⭐
/etc/hosts.equiv, ~/.rhosts 로 패스워드 없이 신뢰 접속 → 위험.
조치:
① 불필요하면 서비스 비활성화 (SSH로 대체)
② 사용 시 소유자 root(또는 해당 계정), 권한 600 이하
③ '+' 설정 제거 (모든 호스트·사용자 허용을 의미)
4-2. TCP Wrapper ⭐⭐
접근 제어 파일: /etc/hosts.allow, /etc/hosts.deny
판단 순서: hosts.allow 먼저 확인 → 일치하면 허용
→ hosts.deny 확인 → 일치하면 거부
→ 둘 다 없으면 허용
보통 hosts.deny에 ALL: ALL, hosts.allow에 허용할 IP/서비스를 적습니다.
4-3. xinetd 설정 ⭐⭐⭐
| 옵션 | 의미 |
| cps = n w | 초당 최대 접속 n, 초과 시 w초간 서비스 중단 |
| instances | 동시 최대 서버 수 |
| per_source | 동일 IP당 최대 접속 수 |
| only_from | 허용 IP |
| no_access | 거부 IP |
| access_times | 허용 시간 HH:MM-HH:MM |
| disable | yes면 서비스 비활성화 |
| log_on_failure | 접속 실패 시 로그 항목 |
기출: 9회 cps = 10 5, instances = 50, per_source = 10
기출: 24회 no_access, only_from, instances, 09:00-18:00
4-4. 배너 노출 (28회 18번 유형)
서버 정보(OS·버전)가 접속 시 노출 → 공격자 정보 수집.
확인 위치: /etc/issue, /etc/issue.net, /etc/motd, vsftpd의 ftpd_banner
조치: 배너에서 OS·버전 정보 제거 또는 경고 문구로 교체
telnet/FTP를 SSH/SFTP로 대체
4-5. 불필요 서비스
echo, discard, daytime, chargen, rlogin, rsh, rexec, rpc.cmsd, rusersd, finger, tftp, talk → 중지·삭제.
5. cron·프로세스·패치 ⭐⭐
5-1. cron (7회 14번 유형)
crontab -l # 목록
crontab -e # 편집
crontab -u 사용자 # 다른 사용자
/etc/cron.allow, /etc/cron.deny # 사용 제한
7회 14번 위험 요소: root cron이 /tmp/passwd1을 /etc/passwd에 덮어쓰기
→ /tmp는 누구나 쓸 수 있어 계정 조작(root 권한 계정 추가) 가능. 또 nc -e /bin/bash 형태의 리버스 셸 실행 코드가 숨어 있을 수 있음.
점검: cron에 등록된 스크립트의 소유자·권한, 쓰기 가능한 경로 참조 여부
5-2. 프로세스·패치
- 숨은 프로세스 확인: /proc 디렉터리, lsof
- 패치 확인:
uname -r등으로 커널·버전 확인 후 최신 패치와 비교
단답 키워드 표 ⭐⭐⭐
| 질문 | 답 |
| 현재 로그인 사용자 | utmp (who) |
| 로그인 이력 | wtmp (last) |
| 로그인 실패 | btmp (lastb) |
| 사용자별 최근 로그인 | lastlog |
| 명령 실행 기록 | pacct (lastcomm) |
| shadow 사용 시 passwd 패스워드 필드 | x |
| shadow 패스워드 변경 날짜 단위 | 1970-01-01 기준 일수 |
| shadow 최대 사용 기간 | 5번째 필드 |
| SUID 숫자 | 4000 |
| SGID 숫자 | 2000 |
| Sticky 숫자 | 1000 |
| 접속 허용/거부 파일 | hosts.allow / hosts.deny |
| PAM 모듈 타입 4가지 | auth, account, password, session |
| 세션 타임아웃 변수 | TMOUT |
| 특수권한 포함 파일 탐색 | find / -perm -4000 |
서술형 답안 구조 ⭐⭐⭐
SUID/SGID (24·27·32회 유형)
정의: 실행 시 파일 소유자(그룹) 권한으로 실행되는 특수 권한
위험: 취약한 SUID 프로그램을 통해 root 권한 획득(권한 상승)
점검: find / -perm -4000 -o -perm -2000
조치: 불필요한 SUID/SGID 제거(chmod -s), 필수 파일만 유지, 주기적 점검
r-command (24·32회 유형)
정의: 패스워드 없이 신뢰 호스트 간 접속을 허용하는 서비스(hosts.equiv, .rhosts)
위험: 신뢰 관계 악용, IP 스푸핑, '+' 설정 시 누구나 접속
조치: 서비스 중지·SSH 대체, 사용 시 파일 소유자 root·권한 600 이하·'+' 제거
계정 보안 (패스워드·잠금)
정책: 최소 길이·복잡도·최대 사용 기간 설정
통제: 실패 횟수 초과 시 잠금(PAM), root 원격 로그인 제한, su 제한
관리: 불필요 계정 삭제, 패스워드 파일 권한(shadow 400)
⚠️ 함정 모음
⚠️ last는 wtmp, lastb는 btmp
⚠️ umask 027 → 파일 640 (637 아님) — 비트 마스크
⚠️ chmod -s 는 SUID와 SGID 모두 제거
⚠️ hosts.allow를 먼저 확인
⚠️ PAM 타입은 4가지 (auth/account/password/session)
⚠️ no_magic_root·reset 해설이 자료마다 다름 → 교재 기준으로 답안 작성
⚠️ pam_tally/pam_tally2는 최신 배포판에서 제거 → 실무는 pam_faillock
⚠️ /etc/shadow는 400, /etc/passwd는 644
기출 Q&A
Q. (22회 3번 유형) exam:x:1000:/home/exam:/bin/bash 처럼 필드가 하나 생략된 passwd 행에서 1000, /home/exam, /bin/bash 는 각각 무엇인가?
A. 1000 = GID, /home/exam = 홈 디렉터리, /bin/bash = 로그인 셸
Q. (15회 14번 유형) 백업 파일이 644여서 다른 사용자가 읽을 수 있다. 조치는?
A. 스크립트에서 umask 077(또는 0177) 설정 → 파일 600, 기존 umask 저장·복원, chown operator + chmod 400
Q. (24회 유형) xinetd에서 특정 IP 거부, 허용 IP 지정, 동시 접속 제한, 접속 시간 제한 옵션은?
A. no_access, only_from, instances, access_times (09:00-18:00)
💡 실무에서는?
- KISA 취약점 점검 관점: 주요정보통신기반시설 기술적 취약점 분석·평가 가이드의 Unix 점검 항목(root 원격 접속 제한, 패스워드 정책, 파일 권한, SUID, 불필요 서비스 등)이 이 편의 내용과 거의 겹칩니다. 시험 공부가 곧 점검 체크리스트예요.
- 로그: 서버 로컬 로그는 침해 시 지워질 수 있어서 rsyslog로 원격 로그 서버에 전송하는 구성이 기본입니다.
- 명령 감사: pacct보다 auditd로 시스템콜·명령 감사를 하는 경우가 많아요.
- 계정 잠금: 최신 배포판은 pam_faillock (/etc/security/faillock.conf).
- root 직접 로그인 금지 + sudo 사용, SSH는 키 인증과 PermitRootLogin no.
핵심 정리
✅ 로그: utmp 현재 / wtmp 이력 / btmp 실패 / lastlog 최근 / pacct 명령 / sulog su
✅ passwd 7필드, shadow 9필드, $6 = SHA-512, ! 또는 * = 로그인 불가
✅ 파일 권한: passwd 644, shadow 400, hosts·inetd.conf 600
✅ umask는 비트 마스크 (027 → 640/750)
✅ SUID 4000 / SGID 2000 / Sticky 1000, find -perm 으로 점검
✅ r-command: 서비스 중지, 쓰는 경우 600 이하·'+' 제거
✅ TCP Wrapper: hosts.allow → hosts.deny 순
✅ xinetd: cps, instances, per_source, only_from, no_access, access_times
📌 참고: 2027년 출제기준 개편에서 1-1에 클라우드·가상화 환경 OS 보안 특성이 추가됩니다.
이번 11/14 시험은 현행 기준이에요.
다음 편에서는 윈도우 보안으로 이어갑니다!
궁금한 점은 댓글로 남겨주세요!
'자격증 정복 > 정보보안(산업)기사' 카테고리의 다른 글
| 정보보안기사 실기 재도전 01 — 소개·재도전 전략·출제 맵 (46점에서 합격으로) (0) | 2026.10.31 |
|---|---|
| 정보보안기사 실기 재도전 접수 완료 — 46점의 아픔, 이번엔 다르다 (근데 일정이...) (0) | 2026.10.19 |
| 정보보안기사 실기 후기 — 46점 불합격, 그래도 11월에 다시 도전한다 (0) | 2026.08.30 |
| 정보보안기사 실기 시험 후기 — 쉬워 보였지만 함정이 있었다 (0) | 2026.07.26 |
| 정보보안기사 실기 D-1 오후 — 실전 답안 요령 + 최종 체크리스트 (0) | 2026.07.24 |