LFCS — 리눅스 재단 시스템 관리자 · SELinux 와 firewalld 를 손으로 — 사용자·ACL·sshd·dnf 까지 · 실습
SELinux 와 firewalld 를 손으로 — 그리고 사용자·ACL·sshd·dnf
목표
AlmaLinux 9 VM 에서 SELinux 불리언·파일 컨텍스트·포트 컨텍스트를 실제로 걸고, firewalld 의 runtime/permanent 와 존·리치 룰을 손으로 다루고, 사용자·sudoers·profile.d·limits·ACL·sshd 드롭인·dnf 잠금을 결과가 남게 구성합니다.
왜 중요한가
LFCS 의 Operations 도메인은 "SELinux 로 접근을 관리하라" 를 명시하고, Networking 도메인은 패킷 필터링과 OpenSSH 를 요구합니다. 파드에는 SELinux 도 firewalld 도 없어서 이 항목들은 모의고사에서만 스쳤습니다. 이 VM 은 Enforcing 이고 firewalld 가 살아 있으므로, 포트 컨텍스트를 빠뜨리면 httpd 가 정말로 뜨지 않고 permanent 를 빠뜨리면 reload 한 순간 규칙이 사라집니다.
세 가지가 반복됩니다. 첫째, 지금 값과 영구 값은 다른 자리에 삽니다 — setsebool 의 -P, chcon 과 semanage fcontext, firewalld 의 runtime 과 permanent. 둘째, 실효값은 파일이 아니라 도구가 알려 줍니다 — sshd -T, getsebool, sudo -l -U, getfacl. 셋째, 잠기지 않게 검사부터 — visudo -cf, sshd -t, apachectl configtest.
⚠️ 채점 에이전트가 8899/tcp 로 들어옵니다. firewalld 를 만질 때 이 포트를 지우거나 기본 존을 drop 으로 바꾸면 채점이 닿지 않아 다음 단계부터 원인 모를 실패가 납니다. 세션은 60분에 시작해 최대 180분까지 연장할 수 있고, VM 은 세션이 끝나면 사라집니다.
단계
1. sestatus 출력을 /root/lfcs/selinux/status.txt 에 저장하세요(Enforcing 이어야 합니다). 그리고 불리언 httpd_can_network_connect 를 재부팅 뒤에도 유지되게 켜세요.
2. /srv/web/index.html 에 selinux ok 를 적고, /srv/web 이하가 영구적으로 httpd_sys_content_t 컨텍스트를 갖게 한 뒤 적용하세요(semanage fcontext + restorecon). tcp 8081 을 http_port_t 로 등록하고, /etc/httpd/conf.d/lfcs.conf 로 httpd 가 8081 에서 /srv/web 을 서비스하게 해 enable·start 하세요. curl http://127.0.0.1:8081/ 이 selinux ok 를 돌려줘야 합니다.
3. 기본 존(public)에 서비스 http 와 포트 8081/tcp 를 runtime 과 permanent 양쪽에 여세요. 채점 포트 8899/tcp 는 그대로 있어야 합니다. 마지막으로 firewall-cmd --list-all 출력을 /root/lfcs/firewall/public.txt 에 저장하세요.
4. 존 lab 을 새로 만들고 출발지 198.51.100.0/24 를 그 존에 배정하세요. lab 존에 서비스 ssh 와, 198.51.100.0/24 에서 오는 tcp 8081 을 허용하는 리치 룰(rule family="ipv4" source address="198.51.100.0/24" port port="8081" protocol="tcp" accept)을 넣으세요. 전부 permanent 로 적고 reload 해서 runtime 에도 보여야 합니다.
5. 그룹 ops 를 만들고 사용자 deploy(홈 디렉터리 있음, 셸 /bin/bash)를 만들어 보조 그룹으로 ops 에 넣으세요. /etc/sudoers.d/ops 에 ops 그룹이 비밀번호 없이 /usr/bin/systemctl 만 sudo 로 실행할 수 있는 규칙을 적고 권한을 0440 으로 두세요. visudo -cf 로 문법이 통과해야 합니다.
6. /etc/profile.d/lfcs.sh 에서 환경 변수 LFCS_ENV 를 lab 으로 export 하세요. /etc/security/limits.d/90-lfcs.conf 에 사용자 deploy 의 열린 파일 수(nofile) hard 한도를 4096 으로, 그룹 ops 의 프로세스 수(nproc) soft 한도를 2048 로 적으세요. su - deploy 로 로그인 셸을 열었을 때 env 에 변수가 보이고 ulimit -Hn 이 4096 이어야 합니다.
7. /srv/web/upload 디렉터리를 root 소유, 권한 750 으로 만들고(chmod 로 넓히지 않습니다), ACL 로 사용자 deploy 에게 rwx 를, 그리고 이 디렉터리 안에 새로 생기는 파일이 그룹 ops 에 r-x 를 물려받도록 기본(default) ACL 을 주세요. getfacl /srv/web/upload 출력을 /root/lfcs/acl/upload.acl 에 저장하세요. (ACL 을 준 뒤 ls -ld 의 그룹 자리는 마스크(rwx)로 보입니다 — 정상입니다.)
8. /etc/ssh/sshd_config.d/50-lfcs.conf 드롭인에 MaxAuthTries 3, ClientAliveInterval 300, PermitRootLogin no 를 적고 sshd 를 재시작하세요. sshd -T 로 본 최종 값이 세 개 모두 그 값이어야 합니다.
9. tree 패키지를 설치하고, 업그레이드에서 제외되도록 versionlock 으로 잠그거나 /etc/dnf/dnf.conf 의 exclude= 에 넣으세요. dnf history list 출력을 /root/lfcs/pkg/history.txt 에, rpm -q tree 출력을 /root/lfcs/pkg/tree.txt 에 저장하세요.
참고
- SELinux:
getenforce,setsebool -P,semanage fcontext -a -t … '/경로(/.*)?'→restorecon -Rv,semanage port -a -t http_port_t -p tcp 8081. 거부 기록은ausearch -m avc -ts recent. - firewalld:
--permanent로 적고--reload.--zone=lab --list-all로 존 하나를 통째로 봅니다. - 사용자:
useradd -m -s /bin/bash -G ops deploy,visudo -cf /etc/sudoers.d/ops,sudo -l -U deploy. - limits 는 로그인 순간에 걸립니다. 이미 열린 셸에서
ulimit을 봐도 바뀌지 않습니다. - 흔한 실수 1:
chcon으로 컨텍스트를 바꾸고 끝내는 경우 —restorecon한 번이면 되돌아갑니다. - 흔한 실수 2: firewalld 규칙을 runtime 에만 넣고
--reload해서 지우는 경우(reload 는 permanent 를 다시 읽습니다). - 흔한 실수 3: profile.d 에서
export를 빼서 셸 변수로만 남는 경우.
단계 9개
- SELinux 모드 확인과 불리언
- 파일 컨텍스트와 포트 컨텍스트로 httpd 를 8081 에
- firewalld 서비스와 포트 — runtime 과 permanent
- 새 존과 리치 룰
- 그룹·사용자·sudoers 규칙
- 로그인 환경과 자원 제한
- ACL 로 소유권 밖의 권한 주기
- sshd 드롭인과 sshd -T
- dnf 설치·잠금·이력