From 987030f24c37f41f2ca9fcb99a9e79f2a81bbbcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=ED=98=81=EC=84=B1?= Date: Fri, 13 Mar 2026 19:30:05 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20[ops]=20=EC=84=9C=EB=B2=84=20=EA=B3=84?= =?UTF-8?q?=EC=A0=95=20=EA=B4=80=EB=A6=AC=20=EB=AC=B8=EC=84=9C=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 09-security: 서버 계정 관리 섹션 신규 추가 (Linux/MySQL 계정 현황, 생성 절차, 잠금/해제) - 09-security: SSH 인증 정책 정리 (패스워드 허용, root 외부 접근 차단) - 01-server-overview: 3개 서버 사용자 정보 업데이트 (hskwon/pro/kkk) - 01-server-overview: 운영 DB 사용자 테이블에 pro, kkk 추가 --- dev/deploys/ops-manual/01-server-overview.md | 8 +- dev/deploys/ops-manual/09-security.md | 99 +++++++++++++++++++- 2 files changed, 100 insertions(+), 7 deletions(-) diff --git a/dev/deploys/ops-manual/01-server-overview.md b/dev/deploys/ops-manual/01-server-overview.md index eb6baf7..bd77643 100644 --- a/dev/deploys/ops-manual/01-server-overview.md +++ b/dev/deploys/ops-manual/01-server-overview.md @@ -18,7 +18,7 @@ | RAM | 8GB | | Swap | 4GB | | 디스크 | 98GB (여유 79GB) | -| 사용자 | hskwon (SSH 키 인증, sudo NOPASSWD) | +| 사용자 | hskwon(개발팀장), pro(개발실장/잠금), kkk(개발자/잠금) | ### 도메인 목록 @@ -117,6 +117,8 @@ |--------|-----------|------|------| | codebridge@localhost | 비밀번호 | sam, sam_stage, sam_stat, codebridge | 애플리케이션 | | hskwon@localhost | auth_socket | ALL (WITH GRANT OPTION) | 관리자 | +| pro@localhost | 비밀번호 (잠금) | codebridge, sam, sam_stage, sam_stat | 개발실장 | +| kkk@localhost | 비밀번호 (잠금) | codebridge, sam, sam_stage, sam_stat | 개발자 (2026-03-13) | | root@localhost | auth_socket | ALL | 시스템 (sudo mysql) | | sam_backup@110.10.147.46 | 비밀번호 | SELECT, LOCK TABLES (sam, sam_stat) | CI/CD 백업 | @@ -135,7 +137,7 @@ | CPU | 4 vCPU | | RAM | 8GB (Swap 4GB) | | Disk | 98GB (사용 15GB / 여유 79GB) | -| 사용자 | hskwon (SSH 키 인증, sudo NOPASSWD) | +| 사용자 | hskwon(개발팀장), pro(개발실장/잠금), kkk(개발자/잠금) | ### 도메인 매핑 @@ -214,7 +216,7 @@ | IP | 114.203.209.83 | | 호스트명 | sam-dev | | OS | Ubuntu 24.04.2 LTS | -| 사용자 | hskwon (SSH 키 인증, sudo NOPASSWD) | +| 사용자 | hskwon(개발팀장), pro(개발실장), kkk(개발자) | ### 서비스 현황 diff --git a/dev/deploys/ops-manual/09-security.md b/dev/deploys/ops-manual/09-security.md index bd227b5..6532586 100644 --- a/dev/deploys/ops-manual/09-security.md +++ b/dev/deploys/ops-manual/09-security.md @@ -4,16 +4,107 @@ --- +## 서버 계정 관리 + +### Linux 계정 현황 + +| 계정 | 이름 | sam-dev | sam-prod | sam-cicd | 비고 | +|------|------|---------|----------|----------|------| +| hskwon | 권혁성 | sudo, users | sudo, users, webservice | sudo, users, webservice | 개발팀장 | +| pro | 김보곤 | develop, sudo, users | pro, sudo, users, webservice (잠금) | pro, sudo, users, webservice (잠금) | 개발실장 | +| kkk | 강영보 | develop, sudo, users | pro, sudo, users, webservice (잠금) | pro, sudo, users, webservice (잠금) | 개발자 (2026-03-13 생성) | + +### MySQL 계정 현황 + +| 계정 | sam-dev | sam-prod | sam-cicd | 비고 | +|------|---------|----------|----------|------| +| hskwon | ALL *.* (auth_socket) | ALL *.* (auth_socket) | ALL *.* (auth_socket) | 개발팀장 | +| codebridge | - | sam, sam_stage, sam_stat, codebridge | - | 앱 사용자 | +| pro | chandj, sam, samdb | codebridge, sam, sam_stage, sam_stat (잠금) | codebridge, gitea, sam, sam_stage, sam_stat (잠금) | 개발실장 | +| kkk | chandj, sam, samdb | codebridge, sam, sam_stage, sam_stat (잠금) | codebridge, gitea, sam, sam_stage, sam_stat (잠금) | 개발자 (2026-03-13 생성) | +| sam_backup | - | - (운영 DB에서 원격 접근) | sam, sam_stat (원격 백업) | CI/CD 백업 | + +### 신규 계정 생성 절차 + +```bash +# 1. 개발서버 (전체 권한) +ssh sam-dev "sudo useradd -m -s /bin/bash -G develop,sudo,users -c '이름' 계정명" +ssh sam-dev "echo '계정명:비밀번호' | sudo chpasswd" + +# 2. 운영/CICD (잠금 상태로 생성) +ssh sam-prod "sudo useradd -m -s /bin/bash -G pro,sudo,users,webservice -c '이름' 계정명" +ssh sam-prod "echo '계정명:비밀번호' | sudo chpasswd" +ssh sam-prod "sudo usermod -L 계정명" # Linux 잠금 + +ssh sam-cicd "sudo useradd -m -s /bin/bash -G pro,sudo,users,webservice -c '이름' 계정명" +ssh sam-cicd "echo '계정명:비밀번호' | sudo chpasswd" +ssh sam-cicd "sudo usermod -L 계정명" # Linux 잠금 + +# 3. DB 계정 — 개발 (활성) +ssh sam-dev "mysql -u root -p'<비밀번호>' -e \" +CREATE USER '계정명'@'localhost' IDENTIFIED BY '비밀번호'; +GRANT ALL PRIVILEGES ON chandj.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON samdb.* TO '계정명'@'localhost'; +FLUSH PRIVILEGES;\"" + +# 4. DB 계정 — 운영/CICD (잠금) +ssh sam-prod "sudo mysql -e \" +CREATE USER '계정명'@'localhost' IDENTIFIED BY '비밀번호'; +GRANT ALL PRIVILEGES ON codebridge.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam_stage.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam_stat.* TO '계정명'@'localhost'; +ALTER USER '계정명'@'localhost' ACCOUNT LOCK; +FLUSH PRIVILEGES;\"" + +ssh sam-cicd "sudo mysql -e \" +CREATE USER '계정명'@'localhost' IDENTIFIED BY '비밀번호'; +GRANT ALL PRIVILEGES ON codebridge.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON gitea.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam_stage.* TO '계정명'@'localhost'; +GRANT ALL PRIVILEGES ON sam_stat.* TO '계정명'@'localhost'; +ALTER USER '계정명'@'localhost' ACCOUNT LOCK; +FLUSH PRIVILEGES;\"" +``` + +### 계정 잠금/해제 + +```bash +# Linux 잠금 해제 +sudo usermod -U 계정명 + +# Linux 잠금 +sudo usermod -L 계정명 + +# MySQL 잠금 해제 +sudo mysql -e "ALTER USER '계정명'@'localhost' ACCOUNT UNLOCK;" + +# MySQL 잠금 +sudo mysql -e "ALTER USER '계정명'@'localhost' ACCOUNT LOCK;" +``` + +--- + ## SSH 키 관리 -양쪽 서버 모두 비밀번호 로그인 비활성화, root SSH 비활성화, 키 인증만 허용. +### SSH 인증 정책 + +| 서버 | 패스워드 인증 | root 외부 접근 | SSH 키 | 비고 | +|------|:----------:|:----------:|:------:|------| +| sam-dev | ✅ 허용 | ❌ 차단 | ✅ 허용 | 개발서버 | +| sam-prod | ✅ 허용 | ❌ 차단 | ✅ 허용 | 운영서버 | +| sam-cicd | ✅ 허용 | ❌ 차단 | ✅ 허용 | CICD서버 | + +> 일반 계정은 패스워드 접근 허용, root는 외부 접근 완전 차단 (`PermitRootLogin no`) ```bash # SSH 설정 확인 sudo grep -E "^(PasswordAuthentication|PermitRootLogin|PubkeyAuthentication)" /etc/ssh/sshd_config -# 올바른 설정: -# PasswordAuthentication no -# PermitRootLogin no +# 현재 설정: +# PasswordAuthentication yes +# PermitRootLogin no # root 외부 접근 완전 차단 # PubkeyAuthentication yes ```