LabHub
学习 学习路径 课程

LFCS — Linux 基金会认证系统管理员

亲手做 SELinux 与 firewalld — 以及用户、ACL、sshd、dnf

在 LabHub 中继续学习

한국어 원문으로 표시합니다.

목표

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, chconsemanage 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.htmlselinux ok 를 적고, /srv/web 이하가 영구적으로 httpd_sys_content_t 컨텍스트를 갖게 한 뒤 적용하세요(semanage fcontext + restorecon). tcp 8081http_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/tcpruntime 과 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/opsops 그룹이 비밀번호 없이 /usr/bin/systemctl 만 sudo 로 실행할 수 있는 규칙을 적고 권한을 0440 으로 두세요. visudo -cf 로 문법이 통과해야 합니다.
  6. /etc/profile.d/lfcs.sh 에서 환경 변수 LFCS_ENVlab 으로 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 를, 그리고 이 디렉터리 안에 새로 생기는 파일이 그룹 opsr-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.confexclude= 에 넣으세요. dnf history list 출력을 /root/lfcs/pkg/history.txt 에, rpm -q tree 출력을 /root/lfcs/pkg/tree.txt 에 저장하세요.

참고

SELinux 모드 확인과 불리언

sestatus 출력을 /root/lfcs/selinux/status.txt 에 저장하세요(Enforcing 이어야 합니다). 그리고 불리언 httpd_can_network_connect재부팅 뒤에도 유지되게 켜세요.

setsebool 에 -P 를 붙이면 정책 저장소에 기록됩니다. 확인은 getsebool 과 semanage boolean -l -C (로컬 변경만 보기).

파일 컨텍스트와 포트 컨텍스트로 httpd 를 8081 에

/srv/web/index.htmlselinux ok 를 적고, /srv/web 이하가 영구적으로 httpd_sys_content_t 컨텍스트를 갖게 한 뒤 적용하세요(semanage fcontext + restorecon). tcp 8081http_port_t 로 등록하고, /etc/httpd/conf.d/lfcs.conf 로 httpd 가 8081 에서 /srv/web 을 서비스하게 해 enable·start 하세요. curl http://127.0.0.1:8081/selinux ok 를 돌려줘야 합니다.

chcon 은 restorecon 하면 사라집니다 — semanage fcontext -a -t <타입> '/srv/web(/.*)?' 가 영구입니다. 포트를 등록하지 않으면 httpd 가 8081 을 bind 하지 못해 시작 자체가 실패합니다(journalctl -u httpd 와 ausearch -m avc 로 확인).

firewalld 서비스와 포트 — runtime 과 permanent

기본 존(public)에 서비스 http 와 포트 8081/tcpruntime 과 permanent 양쪽에 여세요. 채점 포트 8899/tcp 는 그대로 있어야 합니다. 마지막으로 firewall-cmd --list-all 출력을 /root/lfcs/firewall/public.txt 에 저장하세요.

--permanent 를 붙이면 파일에만, 안 붙이면 지금 도는 규칙에만 적용됩니다. 둘 다 하거나, --permanent 로 적고 --reload 하세요. 확인은 --list-services / --permanent --list-services.

새 존과 리치 룰

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 에도 보여야 합니다.

새 존은 --permanent --new-zone=lab 로만 만들 수 있고 reload 해야 runtime 에 나타납니다. --zone=lab --add-source=..., --add-service=..., --add-rich-rule='...'. 확인은 --zone=lab --list-all.

그룹·사용자·sudoers 규칙

그룹 ops 를 만들고 사용자 deploy(홈 디렉터리 있음, 셸 /bin/bash)를 만들어 보조 그룹으로 ops 에 넣으세요. /etc/sudoers.d/opsops 그룹이 비밀번호 없이 /usr/bin/systemctl 만 sudo 로 실행할 수 있는 규칙을 적고 권한을 0440 으로 두세요. visudo -cf 로 문법이 통과해야 합니다.

useradd -m -s /bin/bash -G ops deploy. sudoers 한 줄: %ops ALL=(ALL) NOPASSWD: /usr/bin/systemctl. 문법이 틀리면 sudo 전체가 잠기므로 반드시 visudo -cf 로 검사합니다. sudo -l -U deploy 로 결과를 봅니다.

로그인 환경과 자원 제한

/etc/profile.d/lfcs.sh 에서 환경 변수 LFCS_ENVlab 으로 export 하세요. /etc/security/limits.d/90-lfcs.conf 에 사용자 deploy 의 열린 파일 수(nofile) hard 한도를 4096 으로, 그룹 ops 의 프로세스 수(nproc) soft 한도를 2048 로 적으세요. su - deploy 로 로그인 셸을 열었을 때 env 에 변수가 보이고 ulimit -Hn 이 4096 이어야 합니다.

profile.d 는 로그인 셸이 /etc/profile 을 거치며 읽습니다. export 가 없으면 자식 프로세스(env)에 안 보입니다. limits 줄은 '대상 종류 항목 값' 네 필드이고 그룹은 @ops 입니다. pam_limits 가 로그인 때 적용합니다.

ACL 로 소유권 밖의 권한 주기

/srv/web/upload 디렉터리를 root 소유, 권한 750 으로 만들고(chmod 로 넓히지 않습니다), ACL 로 사용자 deploy 에게 rwx 를, 그리고 이 디렉터리 안에 새로 생기는 파일이 그룹 opsr-x 를 물려받도록 기본(default) ACL 을 주세요. getfacl /srv/web/upload 출력을 /root/lfcs/acl/upload.acl 에 저장하세요. (ACL 을 준 뒤 ls -ld 의 그룹 자리는 마스크(rwx)로 보입니다 — 정상입니다.)

setfacl -m u:deploy:rwx <디렉터리>, 기본 ACL 은 setfacl -d -m g:ops:rx (또는 -m d:g:ops:rx). ls -l 에 + 가 붙으면 ACL 이 있는 것입니다. 마스크(mask) 줄이 실효 권한을 자릅니다.

sshd 드롭인과 sshd -T

/etc/ssh/sshd_config.d/50-lfcs.conf 드롭인에 MaxAuthTries 3, ClientAliveInterval 300, PermitRootLogin no 를 적고 sshd 를 재시작하세요. sshd -T 로 본 최종 값이 세 개 모두 그 값이어야 합니다.

sshd_config 의 Include 는 맨 위에 있어 드롭인이 본문보다 먼저 읽히고, sshd 는 같은 키의 첫 값을 씁니다. sshd -t 로 문법, sshd -T 로 실효값. 콘솔 접속은 sshd 와 무관하니 잠길 걱정은 없습니다.

dnf 설치·잠금·이력

tree 패키지를 설치하고, 업그레이드에서 제외되도록 versionlock 으로 잠그거나 /etc/dnf/dnf.confexclude= 에 넣으세요. dnf history list 출력을 /root/lfcs/pkg/history.txt 에, rpm -q tree 출력을 /root/lfcs/pkg/tree.txt 에 저장하세요.

versionlock 플러그인은 이미 설치돼 있습니다: dnf versionlock add tree / dnf versionlock list. exclude 는 dnf.conf [main] 절의 exclude=tree. history 는 트랜잭션 단위라 설치가 한 줄로 보입니다.