콘텐츠로 이동

OS Bootstrap Runbook (서비스 설치 전 공통 단계)

새 Rocky Linux 운영 서버를 최초 구성할 때,
Node.js / Next.js / PHP / Laravel / MySQL 등 어떤 서비스를 올리기 전까지 공통으로 적용해야 하는 OS 기본 단계
최소한의 Runbook 으로 정리한 것임.

자세한 이론/정책은 기존 문서(SELinux, firewalld, journald, SSH Hardening 등)를 기준으로 하며,
그 내용을 한 번에 실행 가능한 형태로 요약하는 것을 목표로 함.


1. 범위 및 전제

  • 대상 OS: Rocky Linux 9 계열
  • 목적:
    • 새 서버 1대를 가져왔을 때, 서비스 선택 전까지 공통으로 적용하는 OS 기본 보안/운영 기준을 빠르게 완료하기 위함.
    • 설치/구성 세부 내용은 기존 문서를 그대로 따름.
  • 포함:
    • 시스템 업데이트 및 기본 유틸 패키지
    • dnf-automatic 기반 보안 업데이트 자동 적용
    • 운영자 계정 생성 및 sudo 권한 부여
    • SSH 기본 Hardening (RHEL 계열 권장: sshd_config.d/00-custom.conf 기반)
    • firewalld 기본 정책 (SSH 포트/필요 시 CIDR 제한 반영)
    • Fail2ban 설치 및 SSH 보호 기본값 (jail.local 기반)
    • journald 로그 용량 제한
    • cron.allow, sysctl, core dump 제한 등 기본 System Hardening
    • (선택) SSH 포트 변경 시 SELinux ssh_port_t 등록
  • 제외:
    • Nginx, Node.js, Next.js, PHP, Laravel, MySQL 설치/구성
    • /tmp, /var/tmp, /home 등의 mount/fstab 구조 설계
    • /dev/shm 보안 마운트 같은 환경별 선택 강화 항목

2. 실행 방식 개요

운영 서버 최초 구성은 다음 세 단계를 기준으로 함.

  1. OS 공통 Bootstrap 스크립트 실행
  2. 스토리지 구조 의존 Hardening 수동 적용
  3. SSH 재접속 및 기본 동작 확인

본 문서에서 설명하는 스크립트는 다음 위치에 존재함.

os-bootstrap 참고.

이 스크립트는 기존 OS 관련 문서의 내용을 바탕으로 작성된 운영 서버 OS Bootstrap 기준 레퍼런스임.


3. 사전 준비

  • 초기 1회는 root 또는 sudo 권한이 있는 계정으로 접속함.
  • SELinux는 Enforcing 유지를 기본 기준으로 함.
  • SSH 포트, 운영자 계정명 등은 각 조직 정책에 맞게 조정 가능함.

예시:

  • 운영자 계정: adminuser
  • SSH 포트: 22 (필요 시 나중에 변경)

4. 실행 예시

4.1 기본 실행

cd /path/to/project      # 예: /root/RockyLinux-docs clone 위치
sudo bash scripts/os/os-bootstrap.sh

위 명령을 실행하면 다음 작업이 순차적으로 수행됨.

  • 시스템 업데이트 및 기본 유틸 설치
  • dnf-automatic 보안 업데이트 자동 적용 설정
  • adminuser 운영자 계정 생성 (기본값)
  • 운영자 계정 sudoers 등록
  • SSH 기본 Hardening (root SSH 로그인 차단, 인증 방식 제한 등)
  • firewalld 활성화 및 SSH 포트 허용
  • Fail2ban 설치 및 SSH jail 기본 설정
  • journald 로그 용량 제한 정책 적용
  • cron.allow, sysctl, core dump 제한 등 기본 Hardening 적용
  • (선택) SSH 포트 변경 시 SELinux ssh_port_t 등록(Enforcing 기준)

4.2 매개변수 지정 실행

환경 변수로 운영자 계정명, SSH 포트를 지정할 수 있음.

cd /path/to/project
sudo ADMIN_USER=devops SSH_PORT=22 bash scripts/os/os-bootstrap.sh

SSH_PORT 를 22가 아닌 값으로 지정하면 스크립트가
firewalld custom port 정책 + SELinux ssh_port_t 등록을 먼저 반영한 뒤
sshd 를 재시작함.

4.2-1 운영 프로파일 선택 (중요)

이 스크립트는 SSH 노출 형태에 따라 두 프로파일을 제공함.

  • PROFILE=internal (기본값)
    • 내부망/VPN으로만 SSH 접근이 제한되는 관리 서버 기준
    • PasswordAuthentication yes 기본
  • PROFILE=public
    • 외부 노출 SSH 운영 서버 기준
    • 공개키 기반 인증만 허용 (PasswordAuthentication no)
    • ADMIN_AUTHORIZED_KEY 제공이 필수(스크립트가 없으면 실행 중단)

내부망 전용이 아니라면 public을 기준으로 적용하는 것을 권장함.

예시(외부 노출 서버):

cd /path/to/project
sudo PROFILE=public ADMIN_USER=adminuser SSH_PORT=22 \
  ADMIN_AUTHORIZED_KEY="ssh-ed25519 AAAA... user@pc" \
  bash scripts/os/os-bootstrap.sh

4.3 SSH 허용 CIDR 제한 (권장 옵션)

운영 서버에서 SSH를 내부망/VPN 대역으로만 제한하려면 SSH_ALLOW_CIDR을 사용함.

cd /path/to/project
sudo SSH_ALLOW_CIDR=192.168.0.0/24 bash scripts/os/os-bootstrap.sh

이 옵션을 사용하면 firewalld에서 전역 ssh service 허용 대신,
rich-rule 기반으로 source CIDR 제한을 적용함.

4.4 운영자 공개키 자동 반영 (자동화용)

운영 자동화/AI 자동화를 위해 운영자 공개키 1줄을 ADMIN_AUTHORIZED_KEY로 전달하면,
스크립트가 authorized_keys까지 자동 구성함.

cd /path/to/project
sudo ADMIN_USER=adminuser ADMIN_AUTHORIZED_KEY="ssh-ed25519 AAAA... user@pc" bash scripts/os/os-bootstrap.sh

PROFILE=public + ADMIN_AUTHORIZED_KEY 조합으로 실행하면
스크립트가 공개키 등록과 PasswordAuthentication no 전환까지 함께 적용함.
자세한 운영 기준과 판단 근거는 04-SSH 공개키(Public Key) 기반 인증, 08-SSH Hardening 정책 가이드 (운영 서버 기준) 를 따름.


5. 자동화 후 수동 적용 필요 항목

다음 항목은 시스템의 디스크 구조/작업 방식에 따라 달라지므로,
Bootstrap 스크립트가 자동 적용하지 않음.

  • /tmp tmpfs + nodev,nosuid,noexec
  • /var/tmp 디스크 유지 + nodev,nosuid,noexec
  • /homenoexec 적용 여부 판단
  • (선택) /dev/shm 보안 마운트

관련 기준 문서:

즉, 스크립트 실행만으로 전체 OS 베이스라인이 모두 끝난 것은 아니며,
위 항목까지 반영되어야 현재 프로젝트의 OS 문서 기준을 충족한 것으로 봄.


6. 실행 후 확인 항목

Bootstrap 스크립트 실행 후에는 한 번 재부팅을 수행하고, 아래 항목을 확인함.

sudo reboot

재접속 후:

# 필수 서비스 상태
systemctl is-active sshd firewalld fail2ban

# 보안 업데이트 자동 적용
systemctl is-enabled dnf-automatic.timer

# SELinux 상태 (Enforcing)
getenforce

# 방화벽 정책
sudo firewall-cmd --list-all

# journald 로그 용량
sudo journalctl --disk-usage

# sysctl / core dump 정책
sudo sysctl kernel.kptr_restrict fs.suid_dumpable
sudo grep -R "hard core 0" /etc/security/limits.conf /etc/security/limits.d 2>/dev/null

# cron 허용 사용자
sudo cat /etc/cron.allow

위 항목이 정상이라면 OS 공통 Bootstrap 자동화 단계가 완료된 것으로 간주함.
그리고 5. 자동화 후 수동 적용 필요 항목까지 반영되었다면
현재 프로젝트의 OS 베이스라인이 완료된 것으로 봄.
이후에는 각 서비스별 문서(Node.js, Next.js, PHP, Laravel, MySQL 등)를 따라
개별 런타임 및 애플리케이션 구성을 진행함.


7. 역할 정리

  • scripts/os/os-bootstrap.sh
    • OS 공통 초기 구축 중 자동화 가능한 항목을 반영하는 기준 스크립트
    • SSH / firewalld / Fail2ban / journald / dnf-automatic / 기본 System Hardening 을 실제 서버에 반영하는 역할
  • 00-os 하위 개별 문서들
    • SELinux, firewalld, SSH Hardening, journald, mount/fstab 정책 등 세부 기준 및 판단 근거

운영자는 새 서버를 받을 때마다 OS Bootstrap Runbook + 스크립트를 먼저 수행하고,
그 다음에 mount/fstab Hardening 을 반영한 뒤,
서비스별 문서(Node.js / Next.js / Laravel / MySQL 등)를 따라 단계적으로 올리는 것을 기본 흐름으로 삼음.