반응형
데비안 13(Trixie) 기준으로 Node.js + Nginx 운영 서버에 적용할 기본 보안 설정 스크립트입니다. 순서대로 root 권한(sudo bash setup.sh 또는 root 쉘)에서 실행하시면 됩니다.
스크립트 구성 개요
- 시스템 업데이트
- 일반 사용자 생성 + sudo 권한 부여 (root 직접 로그인 방지용)
- SSH 보안 설정 (root 로그인 차단, 포트 변경 옵션)
- 방화벽(UFW) 설정 (SSH, HTTP, HTTPS만 허용)
- Fail2ban 설치 (무차별 대입 공격 방어)
- 자동 보안 업데이트 설정
- Nginx / Node.js 설치
- 기본 커널/네트워크 보안 파라미터 조정
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)으로 무료 인증서를 발급받는 게 좋습니다. 필요하면 이 부분도 스크립트에 추가해드릴 수 있습니다.
반응형
'AI > 정보처리기사기출' 카테고리의 다른 글
| Node.js + Prisma + SQLite 프로젝트를 새 서버 마이그레이션 (0) | 2026.08.17 |
|---|