소개
이 마지막 가이드 실습에서는 여러 RHCSA 준비 기술을 종합합니다. 여전히 명령어 가이드를 제공하지만, 각 단계는 관리자의 실제 검증 워크플로우와 유사하게 구성되어 있습니다. 즉, 시스템을 점검하고, 필요한 상태를 구성하며, 표준 도구를 사용하여 최종 결과를 증명하는 방식입니다.
이번 실습에서는 로컬 운영자 계정을 생성하고, 영구 스토리지를 준비하며, 해당 스토리지에서 작은 서비스를 배포하고, SELinux 및 방화벽 정책을 추가한 뒤, 최종 준비 상태를 확인합니다.
준비된 시스템 점검
이 단계에서는 최종 워크플로우를 위해 준비된 리소스를 점검합니다. 블록 장치, 서비스 상태, SELinux 모드를 확인하는 것부터 시작합니다.
초기 설정에서는 public 영역에 SSH와 3002/tcp 포트의 LabEx 브라우저 터미널 접속을 허용하는 영구 규칙을 구성해 두었습니다. 애플리케이션의 방화벽 정책을 변경할 때도 이 관리용 접속 규칙을 유지하십시오.
프로젝트 디렉토리로 이동합니다.
cd /home/labex/project
준비된 파티션 경로를 표시합니다. 이후 명령어에서 이 경로를 재사용하므로 실습에 어떤 블록 장치가 할당되었는지 추측할 필요가 없습니다.
cat /home/labex/project/rhcsa-final-part
준비된 블록 장치를 검사합니다. 아직 최종 파일 시스템이 생성되지 않았으므로, 이는 포맷 전의 기준 상태입니다.
lsblk "$(cat /home/labex/project/rhcsa-final-part)"
최종 서비스가 아직 구성되지 않았는지 확인합니다. || true를 사용하면 유닛이 현재 존재하지 않더라도 실습이 중단되지 않고 계속 진행됩니다.
systemctl status rhcsa-final-web.service --no-pager || true
시작하기 전에 SELinux 가 enforcing 모드인지 확인합니다. 나중에 설정할 SELinux 레이블은 단순한 정보 제공용이 아니라 정책 적용 여부에 영향을 미치므로 enforcing 모드가 중요합니다.
getenforce
운영자 계정 및 공유 디렉토리 생성
이 단계에서는 로컬 그룹, 로컬 사용자, 그리고 setgid 가 설정된 공유 디렉토리를 생성합니다. 명령어는 필요 시 다시 실행해도 안전하도록 작성되었습니다.
그룹이 존재하지 않으면 생성합니다. getent group은 먼저 로컬 이름 서비스를 확인하며, || 부분은 조회가 실패할 때만 그룹을 생성합니다.
getent group rhcsaops || sudo groupadd rhcsaops
finaladmin 사용자가 존재하지 않으면 생성합니다.
id finaladmin >/dev/null 2>&1 || sudo useradd -m -s /bin/bash -G rhcsaops finaladmin
사용자가 운영자 그룹의 구성원인지 확인합니다. -aG 옵션은 사용자의 기존 보조 그룹을 대체하지 않고 그룹 멤버십을 추가합니다.
sudo usermod -aG rhcsaops finaladmin
id finaladmin
운영자 메모를 위한 공유 디렉토리를 생성합니다. 모드 2770은 그룹에 전체 접근 권한을 부여하고 setgid 비트를 설정하여, 새로 생성되는 파일이 rhcsaops 그룹을 상속받도록 합니다.
sudo mkdir -p /srv/rhcsa-final/team
sudo chown root:rhcsaops /srv/rhcsa-final/team
sudo chmod 2770 /srv/rhcsa-final/team
finaladmin 사용자로 테스트 파일을 작성합니다.
sudo -u finaladmin bash -c 'echo final validation access > /srv/rhcsa-final/team/finaladmin.txt'
디렉토리와 파일을 검사합니다.
sudo stat -c '%a %U:%G %n' /srv/rhcsa-final/team /srv/rhcsa-final/team/finaladmin.txt
영구 스토리지 준비
이 단계에서는 준비된 파티션에 파일 시스템을 생성하고 UUID 를 사용하여 영구적으로 마운트합니다. 이는 RHCSA 스타일 작업에서 사용되는 스토리지 검증 패턴을 반영합니다.
준비된 파티션 경로를 셸 변수에 저장합니다.
part="$(cat /home/labex/project/rhcsa-final-part)"
인식 가능한 레이블을 가진 ext4 파일 시스템을 생성합니다. 이는 실습용 파티션을 초기화하는 작업이므로, 장치 경로를 확인한 후에만 수행합니다.
sudo mkfs.ext4 -F -L RHCSA_FINAL "$part"
마운트 지점을 생성합니다.
sudo mkdir -p /mnt/rhcsa-final
파일 시스템 UUID 를 캡처하고 이 마운트 지점에 대한 기존 fstab 라인을 교체합니다. UUID 는 영구 마운트를 위한 안정적인 식별자이며, 이전 라인을 제거하면 중복된 fstab 항목을 방지할 수 있습니다.
uuid="$(sudo blkid -s UUID -o value "$part")"
sudo sed -i '/\/mnt\/rhcsa-final/d' /etc/fstab
영구 마운트 항목을 추가합니다.
echo "UUID=$uuid /mnt/rhcsa-final ext4 defaults 0 0" | sudo tee -a /etc/fstab
fstab 을 통해 마운트하고 결과를 검사합니다. mount -a는 fstab 라인이 정상 작동함을 증명하며, findmnt와 df는 마운트 대상과 사용 가능한 용량을 확인합니다.
sudo mount -a
findmnt /mnt/rhcsa-final
df -h /mnt/rhcsa-final
최종 서비스 배포 및 활성화
이 단계에서는 마운트된 파일 시스템에 웹 콘텐츠를 배치하고, 로컬 포트 18083에서 이를 서비스하는 systemd 서비스를 생성합니다.
웹 콘텐츠 디렉토리를 생성합니다.
sudo mkdir -p /mnt/rhcsa-final/www
콘텐츠 파일을 생성합니다.
echo "RHCSA final validation service" | sudo tee /mnt/rhcsa-final/www/index.html >/dev/null
labex 서비스 사용자가 콘텐츠를 읽을 수 있도록 권한을 설정하되, 전체 쓰기 권한은 부여하지 않습니다. 서비스는 광범위한 쓰기 권한이 아닌, 그룹 읽기 및 디렉토리 탐색 권한만 필요합니다.
sudo chown -R root:labex /mnt/rhcsa-final/www
sudo chmod 750 /mnt/rhcsa-final/www
sudo chmod 640 /mnt/rhcsa-final/www/index.html
서비스 유닛을 생성합니다. 이 서비스는 마운트된 콘텐츠 디렉토리에서 실행되며 18083 포트의 로컬호스트에 바인딩되므로 curl을 사용하여 로컬에서 쉽게 검증할 수 있습니다.
sudo tee /etc/systemd/system/rhcsa-final-web.service >/dev/null <<'EOF'
[Unit]
Description=RHCSA final validation web service
After=network.target
[Service]
Type=simple
User=labex
Group=labex
WorkingDirectory=/mnt/rhcsa-final/www
ExecStart=/usr/bin/python3 -m http.server 18083 --bind 127.0.0.1
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
유닛 파일을 보호하고, systemd 를 다시 로드한 뒤 서비스를 활성화합니다. /etc/systemd/system 아래의 유닛 파일은 root 소유여야 하며, daemon-reload를 실행해야 systemd 가 새 유닛을 인식한 후 활성화 및 재시작할 수 있습니다.
sudo chown root:root /etc/systemd/system/rhcsa-final-web.service
sudo chmod 644 /etc/systemd/system/rhcsa-final-web.service
sudo systemctl daemon-reload
sudo systemctl enable rhcsa-final-web.service
sudo systemctl restart rhcsa-final-web.service
sleep 1
서비스를 테스트합니다.
systemctl is-active rhcsa-final-web.service
curl -s http://127.0.0.1:18083/
SELinux 및 방화벽 정책 추가
이 단계에서는 서비스 정책을 완성합니다. 콘텐츠와 포트에 대한 영구적인 SELinux 레이블을 추가하고, firewalld 를 사용하여 포트를 엽니다.
영구 파일 컨텍스트 규칙을 추가하거나 업데이트합니다. || 패턴을 사용하면 규칙이 없을 때는 추가하고, 이미 경로에 사용자 지정 규칙이 있을 때는 수정하므로 안전하게 다시 실행할 수 있습니다.
sudo semanage fcontext -a -t httpd_sys_content_t '/mnt/rhcsa-final/www(/.*)?' || sudo semanage fcontext -m -t httpd_sys_content_t '/mnt/rhcsa-final/www(/.*)?'
컨텍스트 규칙을 적용합니다. restorecon은 현재 파일 레이블을 방금 생성한 영구 SELinux 규칙과 일치하도록 변경합니다.
sudo restorecon -Rv /mnt/rhcsa-final/www
SELinux HTTP 포트 레이블을 추가하거나 업데이트합니다. 추가 또는 수정 패턴은 시스템 초기 상태와 포트 레이블이 이미 존재하는 재실행 상황 모두를 처리합니다.
sudo semanage port -a -t http_port_t -p tcp 18083 || sudo semanage port -m -t http_port_t -p tcp 18083
firewalld 를 시작하고 서비스 포트를 영구적으로 엽니다.
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-port=18083/tcp
sudo firewall-cmd --reload
레이블과 방화벽 상태를 점검합니다. 이러한 확인 작업은 정책 설정과 실제 상태 (파일 레이블, 허용된 HTTP 포트 유형, 열린 방화벽 포트) 를 연결합니다.
ls -Z /mnt/rhcsa-final/www/index.html
sudo semanage port -l | grep '^http_port_t'
sudo firewall-cmd --list-ports
최종 준비 상태 확인
이 단계에서는 과정 전반에 걸쳐 사용했던 도구들을 사용하여 전체 시스템 상태를 검증합니다. 이는 서면 보고서가 아닌 운영 상태 점검입니다.
로컬 계정 및 그룹 멤버십을 확인합니다.
id finaladmin
getent group rhcsaops
영구 스토리지를 확인합니다. 실시간 마운트 상태와 저장된 fstab 항목을 모두 확인해야 합니다. 둘 중 하나만 확인하는 것은 스토리지 요구 사항의 절반만 검증하는 것이기 때문입니다.
findmnt /mnt/rhcsa-final
grep /mnt/rhcsa-final /etc/fstab
서비스를 확인합니다.
systemctl is-enabled rhcsa-final-web.service
systemctl is-active rhcsa-final-web.service
curl -s http://127.0.0.1:18083/
SELinux 와 firewalld 를 확인합니다. 최종 상태는 SELinux 가 enforcing 모드여야 하며, 서비스 파일에 HTTP 콘텐츠 레이블이 지정되어 있고, firewalld 에서 18083/tcp 포트가 열려 있어야 합니다.
getenforce
ls -Z /mnt/rhcsa-final/www/index.html
sudo firewall-cmd --list-ports
요약
운영자 계정, setgid 공유 디렉토리, 영구 스토리지, systemd 서비스, SELinux 파일 및 포트 레이블, firewalld 설정, 그리고 명령어 기반의 최종 검증을 수행하여 가이드형 최종 준비 워크플로우를 완료했습니다.



