본문 바로가기
AI/정보처리기사기출

Node.js + Nginx 운영 서버에 적용할 기본 보안 설정

by psluckyguy 2026. 7. 24.
반응형

데비안 13(Trixie) 기준으로 Node.js + Nginx 운영 서버에 적용할 기본 보안 설정 스크립트입니다. 순서대로 root 권한(sudo bash setup.sh 또는 root 쉘)에서 실행하시면 됩니다.

스크립트 구성 개요

  1. 시스템 업데이트
  2. 일반 사용자 생성 + sudo 권한 부여 (root 직접 로그인 방지용)
  3. SSH 보안 설정 (root 로그인 차단, 포트 변경 옵션)
  4. 방화벽(UFW) 설정 (SSH, HTTP, HTTPS만 허용)
  5. Fail2ban 설치 (무차별 대입 공격 방어)
  6. 자동 보안 업데이트 설정
  7. Nginx / Node.js 설치
  8. 기본 커널/네트워크 보안 파라미터 조정
 
bash
#!/bin/bash
# ==========================================================
# Debian 13 (Trixie) 기본 보안 설정 + Node.js/Nginx 환경 구성
# 실행: sudo bash setup.sh
# ==========================================================

set -e  # 오류 발생 시 즉시 스크립트 중단

# ---------- 0. 변수 설정 (환경에 맞게 수정하세요) ----------
NEW_USER="deploy"          # 새로 만들 일반 사용자 이름
SSH_PORT="22"               # SSH 포트 (원하면 22222 등으로 변경 권장)

# ---------- 1. 시스템 패키지 최신화 ----------
apt update && apt -y upgrade   # 패키지 목록 갱신 후 전체 업그레이드
apt -y autoremove              # 불필요한 패키지 제거

# ---------- 2. 일반 사용자 생성 및 sudo 권한 부여 ----------
if ! id "$NEW_USER" &>/dev/null; then
    adduser --gecos "" "$NEW_USER"   # 대화형으로 비밀번호 설정 (계정 정보 질문은 생략)
    usermod -aG sudo "$NEW_USER"     # sudo 그룹에 추가 (관리자 권한 부여)
    echo "사용자 $NEW_USER 생성 및 sudo 권한 부여 완료"
fi

# ---------- 3. SSH 보안 설정 ----------
SSHD_CONFIG="/etc/ssh/sshd_config"
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak.$(date +%F)"   # 원본 설정 백업

sed -i "s/^#\?Port .*/Port ${SSH_PORT}/" "$SSHD_CONFIG"                  # SSH 포트 지정
sed -i "s/^#\?PermitRootLogin .*/PermitRootLogin no/" "$SSHD_CONFIG"      # root 계정 직접 SSH 로그인 금지
sed -i "s/^#\?PasswordAuthentication .*/PasswordAuthentication yes/" "$SSHD_CONFIG"  # 키 인증 설정 전까지는 임시로 비밀번호 허용
sed -i "s/^#\?MaxAuthTries .*/MaxAuthTries 3/" "$SSHD_CONFIG"             # 로그인 시도 3회로 제한
sed -i "s/^#\?ClientAliveInterval .*/ClientAliveInterval 300/" "$SSHD_CONFIG"  # 5분마다 접속 확인(불필요한 연결 정리)
sed -i "s/^#\?ClientAliveCountMax .*/ClientAliveCountMax 2/" "$SSHD_CONFIG"

systemctl restart ssh   # 변경사항 적용 (반영 후 새 세션에서 접속 테스트 필수!)

# ---------- 4. 방화벽(UFW) 설정 ----------
apt -y install ufw
ufw default deny incoming     # 들어오는 모든 연결 기본 차단
ufw default allow outgoing    # 나가는 연결은 허용
ufw allow "${SSH_PORT}"/tcp   # SSH 포트만 허용
ufw allow 80/tcp              # HTTP (Nginx)
ufw allow 443/tcp             # HTTPS (Nginx)
ufw --force enable            # 확인 프롬프트 없이 방화벽 활성화

# ---------- 5. Fail2ban 설치 (무차별 대입 로그인 시도 차단) ----------
apt -y install fail2ban

cat > /etc/fail2ban/jail.local << EOF
[sshd]
enabled = true
port    = ${SSH_PORT}
maxretry = 3
bantime  = 3600
findtime = 600
EOF
# maxretry: 3회 실패 시 차단 / bantime: 1시간 차단 / findtime: 10분 내 시도 횟수 집계

systemctl enable --now fail2ban   # 부팅 시 자동 시작 + 즉시 실행

# ---------- 6. 자동 보안 업데이트 설정 ----------
apt -y install unattended-upgrades apt-listchanges
dpkg-reconfigure -f noninteractive unattended-upgrades
# 보안 패치가 자동으로 설치되도록 설정 (서비스 중단 위험 낮은 보안 업데이트만 적용)

# ---------- 7. Nginx 설치 ----------
apt -y install nginx
systemctl enable --now nginx   # 부팅 시 자동 시작

# ---------- 8. Node.js 설치 (NodeSource 공식 저장소, LTS 버전) ----------
apt -y install curl ca-certificates gnupg
curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
apt -y install nodejs
node -v && npm -v   # 설치 버전 확인

# ---------- 9. 커널 네트워크 보안 파라미터 강화 ----------
cat >> /etc/sysctl.conf << EOF

# ---- 보안 강화 설정 ----
net.ipv4.conf.all.rp_filter = 1        # 스푸핑된 패킷(출발지 위조) 차단
net.ipv4.icmp_echo_ignore_broadcasts = 1  # 브로드캐스트 핑 요청 무시 (스머프 공격 방지)
net.ipv4.tcp_syncookies = 1            # SYN 플러드 공격 방어
net.ipv4.conf.all.accept_source_route = 0 # 소스 라우팅 패킷 차단
net.ipv4.conf.all.accept_redirects = 0    # ICMP 리다이렉트 차단 (중간자 공격 방지)
EOF

sysctl -p   # 변경한 설정 즉시 적용

echo "=========================================="
echo "기본 보안 설정 및 Node.js/Nginx 설치 완료"
echo "새 SSH 접속 테스트: ssh -p ${SSH_PORT} ${NEW_USER}@서버IP"
echo "위 접속이 정상 확인된 후에만 기존 root 세션을 종료하세요."
echo "=========================================="

실행 후 꼭 확인할 것

  • SSH 접속 테스트: 스크립트에서 root 로그인을 막았기 때문에, 반드시 새 터미널을 열어서 deploy 계정으로 접속이 되는지 확인한 뒤 기존 세션을 닫으세요. 안 그러면 서버에서 잠길 수 있습니다.
  • SSH 키 인증: 지금은 편의상 비밀번호 로그인을 열어뒀는데, 공개키 등록 후에는 PasswordAuthentication no로 바꾸는 걸 강력히 권장합니다.
  • Nginx 설정: 이 스크립트는 방화벽/설치만 다룹니다. 실제 Node.js 앱을 리버스 프록시로 연결하려면 /etc/nginx/sites-available/에 서버 블록을 따로 만들어야 합니다. 필요하시면 그 부분도 만들어 드릴게요.
  • HTTPS 인증서: 도메인이 있으면 certbot(Let's Encrypt)으로 무료 인증서를 발급받는 게 좋습니다. 필요하면 이 부분도 스크립트에 추가해드릴 수 있습니다.

 

 

 

반응형