Ubuntu 서버 보안 설정 가이드 (AWS 수준 보안 목표)
이 문서는 AWS EC2 수준의 보안을 목표로 하는 Ubuntu 서버 설정 가이드입니다. 도메인 연결, Docker 기반 배포, 사용자 관리 및 루트 접근 제한 등을 포함합니다. 각 항목은 실무에서 운영 가능한 수준으로 자세히 설명되어 있습니다.
1. 기본 사용자 및 루트 제한
1.1 관리자 계정 생성 (예: pjh)
서버에 직접 루트 로그인하지 않고 관리 작업을 할 수 있도록 관리자 계정을 생성합니다.
sudo adduser pjh
sudo usermod -aG sudo pjh
1.2 루트 로그인 차단 (SSH)
루트 계정으로의 직접 접근을 막고 보안을 강화합니다.
sudo vim /etc/ssh/sshd_config
설정 변경:
PermitRootLogin no
PasswordAuthentication no
AllowUsers pjh
적용:
sudo systemctl restart sshd
1.3 루트 비밀번호 잠금 (선택)
비밀번호 인증 자체를 막고 루트 계정을 비활성화합니다.
sudo passwd -l root
2. su 명령 제한 (wheel 그룹)
2.1 PAM 설정
루트 권한 획득을 제한하기 위해 su 명령 사용을 wheel 그룹 사용자에게만 허용합니다.
sudo vim /etc/pam.d/su
내용 추가 또는 주석 해제:
auth required pam_wheel.so use_uid
2.2 wheel 그룹 생성 및 pjh 추가
sudo groupadd wheel # 존재하지 않을 경우만
sudo usermod -aG wheel pjh
pjh 외 누구도 wheel 그룹에 추가하지 말 것. wheel은 루트 전환 허용 그룹입니다.
3. SSH 보안 설정
3.1 공개키 로그인만 허용
비밀번호 로그인은 중지하고, SSH 키를 통한 로그인만 허용합니다.
PasswordAuthentication no
3.2 접속 허용 사용자 제한
SSH 접근을 특정 사용자만 가능하게 설정합니다.
AllowUsers pjh devuser1 devlead
3.3 방화벽 설정 (UFW)
필요한 포트만 열고 나머지는 차단합니다.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
3.4 SSH 설정파일 경로 및 접근 방법
- 설정파일 경로: /etc/ssh/sshd_config
- 편집 명령: sudo vim /etc/ssh/sshd_config
- 변경 후 적용: sudo systemctl restart sshd
SSH 설정 변경 시에는 현재 세션을 유지한 채 다른 세션을 열고 테스트하여 실수 시 복구할 수 있게 대비합니다.
4. 개발자 계정 추가 및 제한 (서버 측과 개발자 측 역할 구분)
4.1 (서버) 계정 생성
협업할 개발자에게 SSH 계정을 생성합니다.
sudo adduser devuser1
4.2 (서버 + 개발자) 공개키 복사
개발자가 할 일:
- 로컬 PC에서 SSH 공개키 생성 (없을 경우)
ssh-keygen -t rsa -b 4096 -C "devuser1@example.com"
- 생성된 ~/.ssh/id_rsa.pub 파일 내용 전달
서버 관리자가 할 일:
sudo mkdir /home/devuser1/.ssh
sudo vim /home/devuser1/.ssh/authorized_keys
# 전달받은 공개키 붙여넣기
sudo chown -R devuser1:devuser1 /home/devuser1/.ssh
sudo chmod 700 /home/devuser1/.ssh
sudo chmod 600 /home/devuser1/.ssh/authorized_keys
4.3 (서버) sudo 권한 부여 여부 (선택)
특정 사용자(devlead 등)에게만 sudo 권한을 제한적으로 부여합니다.
sudo usermod -aG sudo devlead
절대 wheel 그룹에는 추가하지 마십시오. 해당 그룹은 su로 루트 전환이 가능한 그룹입니다.
5. Docker 기반 배포 준비
5.1 Docker 설치
sudo apt update
sudo apt install docker.io docker-compose -y
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker pjh
5.2 배포 체크리스트
- Dockerfile, docker-compose.yml 작성 완료
- .env 파일 구성 완료 (.env.sample 포함)
- 프론트/백엔드 컨테이너 분리 운영
- nginx + certbot 적용 (HTTPS)
6. nginx & 도메인 연결
6.1 nginx 설치 및 설정
sudo apt install nginx -y
sudo vim /etc/nginx/sites-available/your-domain.com
6.2 리버스 프록시 설정 예시 (Node.js)
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
6.3 HTTPS 적용 (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com
7. 보안 추가 설정
- fail2ban 설치 및 설정 (SSH 브루트포스 방지)
- unattended-upgrades 설치 (보안 패치 자동 적용)
- 시간 동기화: sudo timedatectl set-timezone Asia/Seoul
- logrotate 설정 (nginx 등 로그 관리)
- swap 메모리 설정 (RAM 부족 대비)
8. 계정별 권한 전략 예시
사용자 | sudo | su(root) | 설명 |
pjh | O | O | 마스터 관리자 (운영, 보안, 전체 권한) |
devlead | O | X | 배포 권한 있는 리드 개발자 (운영 일부 가능) |
devuser1 | X | X | 일반 개발자 (코드 작성, SSH 접속만 가능) |
이 설정을 마친 후에는 실제 코드 배포 및 서비스 운영이 가능한 상태가 됩니다. 이후 단계는 Dockerfile 구성, CI/CD 파이프라인, 모니터링 시스템 도입(Netdata, UptimeRobot 등)으로 확장 가능합니다.
'개발 기록' 카테고리의 다른 글
axios.post()만 써도 충분한가요? async/await로 감싸는 이유와 API 구조화 패턴 비교 (0) | 2025.07.02 |
---|---|
Node.js에서 관례적으로 사용하는 변수 표기법 정리 (0) | 2025.05.31 |
도메인 객체 생성을 위한 Factory 패턴 도입기 (1) | 2025.05.09 |