2026-03-06 21:09:57 +09:00
|
|
|
# SAM 서버 접근 권한 관리
|
|
|
|
|
|
|
|
|
|
## 개요
|
|
|
|
|
|
|
|
|
|
SAM 시스템의 서버 및 데이터베이스 접근 권한을 관리합니다.
|
|
|
|
|
서버 관리자는 1명이며, 외부 인원에게는 임시로 접근을 허용하고 작업 완료 후 차단합니다.
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
**최종 업데이트:** 2026-03-07
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 운영 관리자
|
|
|
|
|
|
|
|
|
|
| 계정 | 이름 | 역할 |
|
|
|
|
|
|------|------|------|
|
|
|
|
|
| `hskwon` | 권혁성 | 서버 관리자 (배포, 운영, 인프라) |
|
|
|
|
|
| `pro` | 김보곤 | 서브 관리자 (임시 접근, 평상시 잠금) |
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 서버 정보
|
|
|
|
|
|
|
|
|
|
| 구분 | 호스트 | SSH alias | 용도 |
|
|
|
|
|
|------|--------|-----------|------|
|
|
|
|
|
| 운영 (prod) | 211.117.60.189 | `sam-prod` | API + React 운영 배포 |
|
2026-03-07 01:28:08 +09:00
|
|
|
| 개발 (dev) | - | `sam-dev` | 개발 환경 |
|
|
|
|
|
| CI/CD | 114.203.209.83 | `sam-cicd` | Jenkins + React 개발 배포 + DB 백업 |
|
|
|
|
|
|
|
|
|
|
### 서버 시간대
|
|
|
|
|
|
|
|
|
|
| 설정 | prod | cicd |
|
|
|
|
|
|------|------|------|
|
|
|
|
|
| OS timezone | Asia/Seoul (KST, +0900) | Asia/Seoul (KST, +0900) |
|
|
|
|
|
| NTP 동기화 | 활성 | 활성 |
|
|
|
|
|
| PHP CLI (`/etc/php/8.4/cli/php.ini`) | Asia/Seoul | PHP 미설치 |
|
|
|
|
|
| PHP FPM (`/etc/php/8.4/fpm/php.ini`) | Asia/Seoul | - |
|
|
|
|
|
| Laravel `app.timezone` | Asia/Seoul | - |
|
|
|
|
|
|
|
|
|
|
> **주의:** PHP timezone이 UTC면 스케줄러 실행 시간이 9시간 어긋남. 반드시 Asia/Seoul로 설정할 것.
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## OS 계정 현황
|
|
|
|
|
|
|
|
|
|
### sam-prod (운영서버)
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
| 계정 | 이름 | 용도 | 상태 |
|
|
|
|
|
|------|------|------|------|
|
|
|
|
|
| `hskwon` | 권혁성 | 서버 관리자 (배포, 운영) | 활성 |
|
|
|
|
|
| `pro` | 김보곤 | 서브 관리자 임시 접근용 | 평상시 **잠금** |
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
### sam-cicd (CI/CD 서버)
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
| 계정 | 이름 | 용도 | 상태 |
|
|
|
|
|
|------|------|------|------|
|
|
|
|
|
| `hskwon` | 권혁성 | 서버 관리자 | 활성 |
|
|
|
|
|
| `pro` | 김보곤 | 서브 관리자 임시 접근용 | 평상시 **잠금** |
|
|
|
|
|
|
|
|
|
|
### sam-dev (개발서버)
|
|
|
|
|
|
|
|
|
|
| 계정 | 이름 | 용도 | 상태 |
|
|
|
|
|
|------|------|------|------|
|
|
|
|
|
| `hskwon` | 권혁성 | 서버 관리자 | 활성 |
|
|
|
|
|
| `pro` | 김보곤 | 서브 관리자 | 활성 |
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## OS 계정 잠금/해제
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
서브 관리자에게 서버 접근이 필요한 경우, 작업 시간 동안만 해제하고 완료 후 다시 잠금합니다.
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 계정 잠금
|
|
|
|
|
sudo usermod -L pro
|
|
|
|
|
|
|
|
|
|
# 계정 해제
|
|
|
|
|
sudo usermod -U pro
|
|
|
|
|
|
|
|
|
|
# 상태 확인 (비밀번호 필드 앞에 ! 있으면 잠금 상태)
|
|
|
|
|
sudo passwd -S pro
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 임시 접근 절차
|
|
|
|
|
|
|
|
|
|
1. 작업 요청 접수 및 범위 확인
|
|
|
|
|
2. `sudo usermod -U pro` 로 해제
|
|
|
|
|
3. 작업 완료 확인
|
|
|
|
|
4. `sudo usermod -L pro` 로 잠금
|
|
|
|
|
5. 작업 내용 기록
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
## 공동 관리 구조 (cicd 서버)
|
|
|
|
|
|
|
|
|
|
인력 변동에 대비하여 cicd 서버는 공동 관리 구조로 운영합니다.
|
|
|
|
|
|
|
|
|
|
### develop 그룹
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 그룹 구성원
|
|
|
|
|
$ getent group develop
|
|
|
|
|
develop:x:1004:hskwon,pro
|
|
|
|
|
|
|
|
|
|
# 디렉토리 구조
|
|
|
|
|
/data/
|
|
|
|
|
├── backups/mysql/ # DB 백업 파일 (14일 보관)
|
|
|
|
|
└── scripts/ # 운영 스크립트 + .sam_backup.cnf
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 권한 설정
|
|
|
|
|
|
|
|
|
|
- `/data/` 전체: `develop` 그룹 소유, **setgid** 적용
|
|
|
|
|
- setgid(`chmod g+s`)로 하위에 생성되는 파일/폴더도 자동으로 `develop` 그룹 상속
|
|
|
|
|
- 그룹 권한 = 소유자 권한 (`chmod g=u`)
|
|
|
|
|
- 누가 작업하든 다른 관리자가 접근/수정 가능
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 권한 재설정 필요 시
|
|
|
|
|
sudo chown -R hskwon:develop /data
|
|
|
|
|
sudo chmod -R g=u /data
|
|
|
|
|
sudo chmod g+s /data /data/backups /data/backups/mysql /data/scripts
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2026-03-06 21:09:57 +09:00
|
|
|
## DB 계정 현황
|
|
|
|
|
|
|
|
|
|
### sam-prod (운영서버 MySQL 8.4)
|
|
|
|
|
|
|
|
|
|
| 계정 | 인증 플러그인 | 접근 DB | 용도 |
|
|
|
|
|
|------|-------------|---------|------|
|
|
|
|
|
| `codebridge@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge | 애플리케이션 (.env) |
|
|
|
|
|
| `hskwon@localhost` | caching_sha2_password | 전역 관리자 + sam | 서버 관리자 |
|
2026-03-07 01:28:08 +09:00
|
|
|
| `pro@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge | 서브 관리자용 |
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
### sam-cicd (CI/CD 서버 MySQL 8.4)
|
|
|
|
|
|
|
|
|
|
| 계정 | 인증 플러그인 | 접근 DB | 용도 |
|
|
|
|
|
|------|-------------|---------|------|
|
|
|
|
|
| `hskwon@localhost` | caching_sha2_password | 전역 관리자 | 서버 관리자 |
|
2026-03-07 01:28:08 +09:00
|
|
|
| `pro@localhost` | caching_sha2_password | sam, sam_stage, sam_stat, codebridge, gitea | 서브 관리자용 |
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
> **참고:** cicd 서버에는 `codebridge` DB 계정이 없음 (애플리케이션이 다른 계정 사용)
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
### sam-dev (개발서버 MySQL 8.4)
|
|
|
|
|
|
|
|
|
|
| 계정 | 용도 |
|
|
|
|
|
|------|------|
|
|
|
|
|
| `pro@localhost` | 서브 관리자용 |
|
|
|
|
|
|
|
|
|
|
> **참고:** dev 서버는 `sudo mysql` 불가, root 비밀번호 인증 방식
|
|
|
|
|
|
2026-03-06 21:09:57 +09:00
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## DB 계정 관리
|
|
|
|
|
|
|
|
|
|
### 계정 잠금/해제 (MySQL)
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
-- 계정 잠금
|
|
|
|
|
ALTER USER 'pro'@'localhost' ACCOUNT LOCK;
|
|
|
|
|
|
|
|
|
|
-- 계정 해제
|
|
|
|
|
ALTER USER 'pro'@'localhost' ACCOUNT UNLOCK;
|
|
|
|
|
|
|
|
|
|
-- 상태 확인
|
|
|
|
|
SELECT user, host, account_locked FROM mysql.user WHERE user = 'pro';
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 인증 플러그인 변경
|
|
|
|
|
|
|
|
|
|
MySQL 8.4에서는 `mysql_native_password`가 제거되었으므로 `caching_sha2_password`를 사용합니다.
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
ALTER USER 'username'@'localhost' IDENTIFIED WITH caching_sha2_password BY '비밀번호';
|
|
|
|
|
FLUSH PRIVILEGES;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### PhpStorm 접속 시 주의사항
|
|
|
|
|
|
|
|
|
|
- SSH 터널 필수 (MySQL이 localhost만 허용)
|
|
|
|
|
- Host: `localhost` (127.0.0.1 아님)
|
|
|
|
|
- `caching_sha2_password` 사용 시 Advanced 탭에서 `allowPublicKeyRetrieval = true` 설정 필요
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
## DB 리플리케이션
|
|
|
|
|
|
|
|
|
|
운영 DB(prod)에서 cicd 서버로 실시간 리플리케이션이 구성되어 있습니다.
|
|
|
|
|
|
|
|
|
|
| 항목 | 값 |
|
|
|
|
|
|------|---|
|
|
|
|
|
| Source (마스터) | sam-prod (211.117.60.189) |
|
|
|
|
|
| Replica (슬레이브) | sam-cicd |
|
|
|
|
|
| 리플리케이션 사용자 | `sam_backup` |
|
|
|
|
|
| 대상 DB | **sam, sam_stat, codebridge** |
|
|
|
|
|
| 지연 | 0초 (실시간) |
|
|
|
|
|
|
|
|
|
|
```sql
|
|
|
|
|
-- cicd에서 리플리케이션 상태 확인
|
|
|
|
|
SHOW REPLICA STATUS\G
|
|
|
|
|
|
|
|
|
|
-- 확인 항목
|
|
|
|
|
-- Replica_IO_Running: Yes
|
|
|
|
|
-- Replica_SQL_Running: Yes
|
|
|
|
|
-- Seconds_Behind_Source: 0
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## DB 백업
|
|
|
|
|
|
|
|
|
|
리플리케이션과 별도로, cicd 서버에서 매일 03:00에 mysqldump 백업을 수행합니다.
|
|
|
|
|
|
|
|
|
|
### 백업 설정
|
|
|
|
|
|
|
|
|
|
| 항목 | 값 |
|
|
|
|
|
|------|---|
|
|
|
|
|
| 스크립트 | `/data/scripts/backup-db.sh` |
|
|
|
|
|
| 인증 파일 | `/data/scripts/.sam_backup.cnf` |
|
|
|
|
|
| 백업 경로 | `/data/backups/mysql/` |
|
|
|
|
|
| 실행 시간 | 매일 03:00 (cron, hskwon 사용자) |
|
|
|
|
|
| 보관 기간 | 14일 |
|
|
|
|
|
|
|
|
|
|
### 백업 대상
|
|
|
|
|
|
|
|
|
|
| DB | 방식 | 파일명 패턴 |
|
|
|
|
|
|----|------|------------|
|
|
|
|
|
| sam | 원격 (prod) | `sam_production_YYYYMMDD_HHMMSS.sql.gz` |
|
|
|
|
|
| sam_stat | 원격 (prod) | `sam_stat_production_YYYYMMDD_HHMMSS.sql.gz` |
|
|
|
|
|
| codebridge | 원격 (prod) | `codebridge_production_YYYYMMDD_HHMMSS.sql.gz` |
|
|
|
|
|
| gitea | 로컬 (cicd) | `gitea_YYYYMMDD_HHMMSS.sql.gz` |
|
|
|
|
|
|
|
|
|
|
### 백업 확인
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 최근 백업 파일 확인
|
|
|
|
|
ls -lt /data/backups/mysql/ | head -10
|
|
|
|
|
|
|
|
|
|
# 백업 로그 확인
|
|
|
|
|
tail /data/backups/mysql/backup.log
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2026-03-06 21:09:57 +09:00
|
|
|
## 배포 계정 관리
|
|
|
|
|
|
|
|
|
|
### Jenkins 배포 흐름
|
|
|
|
|
|
|
|
|
|
| 프로젝트 | main | develop |
|
|
|
|
|
|----------|------|---------|
|
|
|
|
|
| **api** | Jenkins (Stage + Production) | post-update hook (Jenkins 미관여) |
|
|
|
|
|
| **react** | Jenkins (Stage + Production) | Jenkins (Development) |
|
|
|
|
|
|
|
|
|
|
- 배포 SSH 계정: `hskwon` (deploy-ssh-key 크레덴셜)
|
|
|
|
|
- Slack 알림: `#deploy_api`, `#deploy_react`
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 관리 정책
|
|
|
|
|
|
2026-03-07 01:28:08 +09:00
|
|
|
1. **서버 관리자 1명 원칙** -- 여러 명이 동시에 관리하지 않음
|
|
|
|
|
2. **임시 접근만 허용** -- 서브 관리자는 필요 시에만 OS/DB 계정 해제
|
|
|
|
|
3. **작업 완료 후 즉시 잠금** -- 해제 상태로 방치하지 않음
|
|
|
|
|
4. **DB 접근은 SSH 터널 경유** -- 외부에서 MySQL 직접 접근 불가 (localhost 바인딩)
|
|
|
|
|
5. **공동 관리 대비** -- cicd `/data/`는 develop 그룹으로 관리, 인력 변동 대비
|
|
|
|
|
6. **이중 백업** -- 리플리케이션(실시간) + mysqldump(매일 03:00) 병행
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 참고
|
|
|
|
|
|
|
|
|
|
- API 보안 가이드: [security-policy.md](./security-policy.md)
|
|
|
|
|
- Docker 설정: [docker-setup.md](./docker-setup.md)
|
|
|
|
|
- 원격 근무 설정: [remote-work-setup.md](./remote-work-setup.md)
|
2026-03-07 01:28:08 +09:00
|
|
|
- Jenkins 설정: [../dev/guides/jenkins-setup-guide.md](../dev/guides/jenkins-setup-guide.md)
|
2026-03-06 21:09:57 +09:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
**작성일:** 2026-03-05
|
2026-03-07 01:28:08 +09:00
|
|
|
**버전:** 1.1
|
2026-03-06 21:09:57 +09:00
|
|
|
**담당자:** SAM Infrastructure Team
|