Skip to content

Commit a568df2

Browse files
committed
메인 페이지 수정
1 parent f0bcf3f commit a568df2

6 files changed

Lines changed: 177 additions & 17 deletions

File tree

.env.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
PUBLIC_DOMAIN=mori.rmstudio.co.kr
22
PUBLIC_PORT=37854
3-
PUBLIC_URL=http://mori.rmstudio.co.kr:37854
3+
GRAFANA_PORT=13000
4+
GRAFANA_URL=http://mori.rmstudio.co.kr:13000
45
TIMEZONE=Asia/Seoul
56

67
GRAFANA_ADMIN_USER=admin

README.md

Lines changed: 94 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,21 @@
2121
## 1. 배포 목표
2222

2323
- 공개 주소: `http://mori.rmstudio.co.kr:37854`
24+
- Grafana 주소: `http://mori.rmstudio.co.kr:13000`
25+
- Zabbix 주소: `http://mori.rmstudio.co.kr:18081`
2426
- 배포 경로: `/backup/rmstudio/mori`
2527
- 배포 방식: GitHub Actions + SSH
2628
- 실행 방식: `docker compose`
2729

28-
현재 외부 공개 진입점은 **Grafana**입니다.
30+
현재 외부 공개 진입점은 **메인 포털**이며,
31+
포털에서 Grafana와 Zabbix 운영 UI로 이동하는 구조입니다.
2932

3033
## 2. 현재 구성된 서비스
3134

3235
### Public Entry
33-
- `Grafana` (`37854`)
36+
- `Main Portal` (`37854`)
37+
- `Grafana` (`13000`)
38+
- `Zabbix Web` (`18081`, 기본값)
3439

3540
### Internal Services
3641
- `Loki`: 중앙 로그 저장소
@@ -43,11 +48,12 @@
4348
## 3. 포트 구성
4449

4550
- Public
46-
- `37854` → Grafana
51+
- `37854` → Main Portal
52+
- `13000` → Grafana
53+
- `18081` → Zabbix Web
4754

4855
- Internal / localhost only
49-
- `127.0.0.1:18081` → Zabbix Web
50-
- `127.0.0.1:1337` → FleetDM
56+
- `127.0.0.1:1337` → FleetDM
5157
- `127.0.0.1:8443` → Wazuh Dashboard
5258

5359
- Service ports
@@ -64,6 +70,7 @@
6470
- `generate-indexer-certs.yml`: Wazuh 인증서 생성용 compose 파일
6571
- `.github/workflows/deploy.yml`: GitHub Actions 배포 워크플로우
6672
- `docs/DEPLOYMENT.md`: 서버 준비 및 운영 가이드
73+
- `config/portal/index.html`: 메인 포털 페이지
6774
- `config/*`: 각 서비스별 설정 파일
6875

6976
## 5. 배포 방식
@@ -86,6 +93,8 @@ GitHub Actions가 아래 순서로 동작하도록 구성했습니다.
8693
단, Grafana 볼륨이 이미 생성된 뒤에는 `.env` 값을 바꿔도 기존 비밀번호가 유지될 수 있으므로,
8794
로그인이 안 되면 `docs/DEPLOYMENT.md`의 Grafana 트러블슈팅 절차를 먼저 확인하세요.
8895

96+
메인 포털은 `PUBLIC_PORT`, Grafana는 `GRAFANA_PORT`, Grafana URL 표시는 `GRAFANA_URL`을 사용합니다.
97+
8998
반드시 변경해야 하는 값:
9099

91100
- `GRAFANA_ADMIN_PASSWORD`
@@ -131,20 +140,97 @@ GitHub Actions가 아래 순서로 동작하도록 구성했습니다.
131140
또한 Wazuh Dashboard의 설정 마운트 충돌 가능성을 제거하도록 compose를 보정했습니다.
132141
Wazuh 인증서 마운트도 디렉터리 방식으로 보정해 파일/디렉터리 마운트 꼬임 가능성을 낮췄습니다.
133142
Grafana에는 Loki 데이터소스와 starter overview dashboard 프로비저닝을 추가했습니다.
143+
메인 포털 페이지도 추가해 37854 포트에서 운영 UI 동선을 제공하도록 구성했습니다.
134144

135145
## 10. 운영 메모
136146

137-
- 현재 공개 서비스는 Grafana만 노출합니다.
138-
- Zabbix / FleetDM / Wazuh Dashboard는 localhost 바인딩으로 제한했습니다.
147+
- 현재 공개 서비스는 Main Portal, Grafana, Zabbix Web입니다.
148+
- FleetDM / Wazuh Dashboard는 localhost 바인딩으로 제한했습니다.
149+
- 메인 포털(`37854`)에서 Grafana(`13000`)와 Zabbix(`18081`)로 이동할 수 있습니다.
150+
- Zabbix 알람/트리거 조정은 Web UI를 통해 운영할 수 있습니다.
139151
- Grafana admin 기본값은 `admin / 1234`입니다.
140152
- Grafana 로그인 실패는 대부분 기존 `grafana-data` 볼륨에 남아 있는 초기 비밀번호 때문입니다.
141153
- Wazuh 기본 예제 계정은 공식 예시 기본값(`SecretPassword`)을 사용 중입니다.
142154
- Wazuh 비밀번호를 변경하려면 `config/wazuh_indexer/internal_users.yml`의 해시와 관련 설정을 함께 수정해야 합니다.
143155
- Trivy 스캔은 필요 시 profile로 실행합니다.
144156

145-
## 11. 다음 작업 후보
157+
## 11. 어떻게 테스트하면 되는지
158+
159+
배포 후 아래 순서로 최소 기능 테스트를 진행하면 됩니다.
160+
161+
### 1) 컨테이너 상태 확인
162+
163+
- `docker compose ps`
164+
- `docker compose logs grafana --tail=50`
165+
- `docker compose logs zabbix-web --tail=50`
166+
167+
정상 기준:
168+
169+
- 주요 컨테이너가 `Up` 상태
170+
- Grafana / Zabbix Web 로그에 치명 오류가 없음
171+
172+
### 2) Grafana 로그인 테스트
173+
174+
- 메인 포털 접속: `http://mori.rmstudio.co.kr:37854`
175+
- Grafana 접속: `http://mori.rmstudio.co.kr:13000`
176+
- 계정: `admin / 1234`
177+
- 확인 항목:
178+
- 메인 포털에서 Grafana 링크 이동 가능
179+
- 로그인 성공
180+
- `MORI Security Overview` 대시보드 표시
181+
- Explore에서 Loki 데이터소스 선택 가능
182+
183+
로그인이 안 되면 `docs/DEPLOYMENT.md`의 Grafana 비밀번호 리셋 절차를 수행합니다.
184+
185+
### 3) Zabbix Web UI 테스트
186+
187+
- 메인 포털 접속: `http://mori.rmstudio.co.kr:37854`
188+
- 접속: `http://mori.rmstudio.co.kr:18081`
189+
- 확인 항목:
190+
- 메인 포털에서 Zabbix 링크 이동 가능
191+
- 로그인 화면 노출
192+
- Zabbix 서버 연결 오류가 없는지 확인
193+
- 향후 트리거/알람 조정용 UI로 접근 가능한지 확인
194+
195+
### 4) Loki 로그 수집 테스트
196+
197+
Grafana Explore에서 Loki로 아래 쿼리를 실행합니다.
198+
199+
- `{job="fluent-bit"}`
200+
201+
정상 기준:
202+
203+
- 호스트 로그가 조회됨
204+
- 새 로그가 시간 흐름에 따라 계속 유입됨
205+
206+
### 5) Wazuh / Fleet 접속 테스트
207+
208+
- FleetDM: 서버에서 `http://127.0.0.1:1337`
209+
- Wazuh Dashboard: 서버에서 `https://127.0.0.1:8443`
210+
211+
현재 두 서비스는 외부 공개하지 않고 내부 운영용으로 유지합니다.
212+
213+
### 6) 취약점 스캔 테스트
214+
215+
- `docker compose --profile scanner run --rm trivy`
216+
217+
정상 기준:
218+
219+
- Trivy가 실행되고 결과 테이블이 출력됨
220+
221+
### 7) 운영 테스트 체크리스트
222+
223+
- 메인 포털 접속 가능
224+
- Grafana 로그인 가능
225+
- Zabbix Web UI 접속 가능
226+
- Loki 로그 조회 가능
227+
- Trivy 실행 가능
228+
- Wazuh/Fleet 내부 포트 접속 가능
229+
230+
## 12. 다음 작업 후보
146231

147232
- Grafana 대시보드/프로비저닝 고도화
233+
- Zabbix 템플릿/API 자동화 또는 통합 운영 UI 설계
148234
- HTTPS 리버스 프록시(Nginx/Caddy) 추가
149235
- Wazuh/Fleet 초기 운영 설정 보강
150236
- 실제 서버 기동 후 헬스체크 및 초기 로그인 검증

config/grafana/provisioning/dashboards/mori-overview.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"gridPos": {"h": 8, "w": 24, "x": 0, "y": 0},
1111
"options": {
1212
"mode": "markdown",
13-
"content": "# MORI SOC-lite\n\n- Public entry: `http://mori.rmstudio.co.kr:37854`\n- Infrastructure Monitoring: Zabbix\n- Endpoint Security: FleetDM\n- Log Management: Loki + Fluent Bit\n- Security Event Detection: Wazuh\n- Vulnerability Scan: Trivy\n\n이 대시보드는 starter dashboard이며, 기능 정의서 기준 KPI 패널은 이후 단계에서 확장합니다."
13+
"content": "# MORI SOC-lite\n\n- Main Portal: `http://mori.rmstudio.co.kr:37854`\n- Grafana: `http://mori.rmstudio.co.kr:13000`\n- Zabbix Web: `http://mori.rmstudio.co.kr:18081`\n- Endpoint Security: FleetDM\n- Log Management: Loki + Fluent Bit\n- Security Event Detection: Wazuh\n- Vulnerability Scan: Trivy\n\n이 대시보드는 starter dashboard이며, 기능 정의서 기준 KPI 패널은 이후 단계에서 확장합니다."
1414
}
1515
},
1616
{

config/portal/index.html

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<!doctype html>
2+
<html lang="ko">
3+
<head>
4+
<meta charset="utf-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1" />
6+
<title>MORI SOC-lite Portal</title>
7+
<style>
8+
body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, sans-serif; background: #0b1220; color: #e5e7eb; }
9+
.wrap { max-width: 980px; margin: 0 auto; padding: 48px 20px; }
10+
h1 { margin-bottom: 8px; }
11+
p { color: #cbd5e1; line-height: 1.6; }
12+
.grid { display: grid; gap: 16px; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); margin-top: 28px; }
13+
.card { background: #111827; border: 1px solid #334155; border-radius: 14px; padding: 20px; }
14+
.card h2 { margin-top: 0; font-size: 20px; }
15+
.button { display: inline-block; margin-top: 12px; padding: 10px 14px; border-radius: 10px; background: #2563eb; color: white; text-decoration: none; font-weight: 600; }
16+
.muted { font-size: 14px; color: #94a3b8; }
17+
code { background: #1e293b; padding: 2px 6px; border-radius: 6px; }
18+
</style>
19+
</head>
20+
<body>
21+
<div class="wrap">
22+
<h1>MORI SOC-lite Main Portal</h1>
23+
<p>보안 가시성 운영 포털입니다. 여기서 Grafana 대시보드와 Zabbix 관리 UI로 이동할 수 있습니다.</p>
24+
25+
<div class="grid">
26+
<div class="card">
27+
<h2>Grafana</h2>
28+
<p>로그 조회, Loki Explore, 보안 현황 대시보드 확인.</p>
29+
<a id="grafana-link" class="button" href="#">Grafana 열기</a>
30+
<div class="muted">기본 포트: <code>13000</code></div>
31+
</div>
32+
33+
<div class="card">
34+
<h2>Zabbix Web</h2>
35+
<p>호스트, 트리거, 알람, 템플릿을 세밀하게 조정하는 운영 UI.</p>
36+
<a id="zabbix-link" class="button" href="#">Zabbix 열기</a>
37+
<div class="muted">기본 포트: <code>18081</code></div>
38+
</div>
39+
40+
<div class="card">
41+
<h2>Internal Services</h2>
42+
<p>FleetDM과 Wazuh Dashboard는 현재 외부에 공개하지 않고 서버 내부 포트로만 운영합니다.</p>
43+
<div class="muted">FleetDM: <code>127.0.0.1:1337</code></div>
44+
<div class="muted">Wazuh: <code>127.0.0.1:8443</code></div>
45+
</div>
46+
</div>
47+
</div>
48+
49+
<script>
50+
const base = `${window.location.protocol}//${window.location.hostname}`;
51+
document.getElementById('grafana-link').href = `${base}:13000`;
52+
document.getElementById('zabbix-link').href = `${base}:18081`;
53+
</script>
54+
</body>
55+
</html>

docker-compose.yml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
services:
2+
portal:
3+
image: nginx:alpine
4+
restart: unless-stopped
5+
ports:
6+
- "${PUBLIC_PORT:-37854}:80"
7+
volumes:
8+
- ./config/portal:/usr/share/nginx/html:ro
9+
networks: [soc]
10+
211
grafana:
312
image: grafana/grafana-oss:11.5.2
413
restart: unless-stopped
514
depends_on:
615
- loki
716
environment:
817
GF_SERVER_DOMAIN: ${PUBLIC_DOMAIN:-mori.rmstudio.co.kr}
9-
GF_SERVER_ROOT_URL: ${PUBLIC_URL:-http://mori.rmstudio.co.kr:37854}
18+
GF_SERVER_ROOT_URL: ${GRAFANA_URL:-http://mori.rmstudio.co.kr:13000}
1019
GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin}
1120
GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-1234}
1221
GF_USERS_ALLOW_SIGN_UP: "false"
1322
ports:
14-
- "${PUBLIC_PORT:-37854}:3000"
23+
- "${GRAFANA_PORT:-13000}:3000"
1524
volumes:
1625
- grafana-data:/var/lib/grafana
1726
- ./config/grafana/provisioning:/etc/grafana/provisioning:ro
@@ -85,7 +94,7 @@ services:
8594
PHP_TZ: ${TIMEZONE:-Asia/Seoul}
8695
ZBX_SERVER_NAME: MORI SOC-lite
8796
ports:
88-
- "127.0.0.1:${ZABBIX_WEB_PORT:-18081}:8080"
97+
- "${ZABBIX_WEB_PORT:-18081}:8080"
8998
networks: [soc]
9099

91100
mysql:

docs/DEPLOYMENT.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
### 1. 공개 진입점
44

55
- 메인 URL: `http://mori.rmstudio.co.kr:37854`
6-
- 공개 서비스: `Grafana`
6+
- 메인 포털: `http://mori.rmstudio.co.kr:37854`
7+
- Grafana: `http://mori.rmstudio.co.kr:13000`
8+
- 공개 관리 UI: `http://mori.rmstudio.co.kr:18081` (`Zabbix Web`)
79
- 내부/로컬 관리 포트
8-
- `127.0.0.1:18081` → Zabbix Web
9-
- `127.0.0.1:1337` → FleetDM
10+
- `127.0.0.1:1337` → FleetDM
1011
- `127.0.0.1:8443` → Wazuh Dashboard
1112

1213
### 2. 서버 사전 준비
@@ -29,6 +30,12 @@ sudo sysctl -w vm.max_map_count=262144
2930
다만 첫 기동 시 생성된 `grafana-data` 볼륨에 이전 비밀번호가 남아 있으면,
3031
`.env` 값을 변경해도 바로 로그인 비밀번호가 바뀌지 않습니다.
3132

33+
포트 구성은 아래 기준입니다.
34+
35+
- `PUBLIC_PORT=37854` → 메인 포털
36+
- `GRAFANA_PORT=13000` → Grafana
37+
- `ZABBIX_WEB_PORT=18081` → Zabbix Web
38+
3239
필수 변경값:
3340

3441
- `GRAFANA_ADMIN_PASSWORD`
@@ -114,7 +121,9 @@ docker compose restart grafana
114121

115122
### 8. 운영 메모
116123

117-
- 현재 공개 포트는 Grafana만 사용합니다.
124+
- 현재 공개 포트는 Main Portal, Grafana, Zabbix Web입니다.
125+
- 메인 포털에서 운영자가 Grafana/Zabbix로 이동하는 구조입니다.
126+
- Zabbix 알람/트리거 운영은 Web UI를 통해 직접 조정할 수 있습니다.
118127
- 수동 실행 시에는 `docker-compose` 대신 `docker compose` 사용을 권장합니다.
119128
- Wazuh 기본 계정 해시는 공식 예제 기본값(`SecretPassword`) 기준입니다.
120129
- Wazuh 기본 비밀번호를 변경하려면 `config/wazuh_indexer/internal_users.yml` 해시와 관련 설정을 함께 수정해야 합니다.

0 commit comments

Comments
 (0)