보안 설정
검색된 문서를 기반으로 exemONE의 보안 설정 기능을 상세히 설명드리겠습니다.
exemONE 보안 설정 기능 상세 설명
exemONE의 보안 설정은 접근 제어(IP 제어·역할 권한), 암호화(비밀번호·Webhook Payload·DB), TLS 설정, 세션 보안, 외부 인증(SSO) 으로 구성됩니다.
1. 접근 제어 (Access Control)
1-1. 로그인 IP 접근 제어 (Login IP Control)
메뉴 경로: Setting > Management > Security > Login IP Control
지원 버전: Front v3.0.503.1.1 이상, API v3.0.503.1.4 이상 접근 권한: Master, Admin 계정만 접근 가능
특정 IP 범위 및 주소에 대한 웹 접속 액세스를 허용하고, 사용자별 로그인 허용 IP를 관리합니다.
Login IP Control 화면 구성

| 순번 | 항목 | 내용 |
|---|---|---|
| 1 | Login IP Control | 시스템 접속을 허용할 IP를 관리하는 화면으로 IP 목록을 보여줍니다. |
| 2 | 새로고침 아이콘 | 클릭 시, 새로고침된 시각 정보로 변경되고 목록이 갱신됩니다. |
| 3 | Delete / Add IP | Delete: IP 목록 선택 시 활성화되며 삭제 / Add IP: 관리할 IP를 등록하는 화면이 표시 |
| 4 | Search | 등록된 IP 목록을 검색합니다. |
| 5 | column | - IP Name: IP를 식별하기 위한 이름 - IP: 접근을 허용할 IP 주소 - User ID: IP를 사용하는 사용자 이름 - Description: 설명란 - Active: 등록된 IP의 접근을 허용하는 기능으로 등록 시 바로 활성화 |
Add IP 버튼

| 순번 | 항목 | 내용 |
|---|---|---|
| 1 | IP Name | IP를 식별하기 위한 이름 |
| 2 | IP | 접근을 허용할 IP 주소 |
| 3 | Description | 등록할 IP에 대한 설명 |
IP 접근 제어 설정 단계별 방법
[Step 1] 접근 허용 IP 등록
환경설정 > 보안 > 로그인 IP 제어에서 "IP 추가" 를 선택하여 접근 허용 IP를 추가합니다.
- 하나의 계정이 여러 정책에 포함될 수 있으며, 하나의 정책이라도 허용 IP 조건이 맞으면 접속 가능합니다.

- IP 등록은 단일 IP 및 CIDR 형식으로 등록 가능합니다.
- 혼합 입력 및 중복 등록 가능 (예: CIDR가 단일 IP를 포함하는 경우)

[Step 2] 등록된 IP 접근 목록에 대한 사용자 등록
환경설정 > 사용자 & 사용자 그룹 > 사용자 추가 또는 편집에서 IP 접근 제어하고자 하는 계정에 IP 접근 목록을 등록합니다.
- IP 접근 목록에서 Active된 목록만 표시됩니다.

[Step 3] IP 접근 차단 확인
허용된 IP가 아닌 IP로 로그인 시 접근 차단을 확인할 수 있습니다.

User ID 컬럼 연동 방법:
User & User Group > ID > IP Setting > 설정 IP만 로그인 허용으로 체크후 Control에서 설정

1-2. 로그인 실패 이력 (Login Failure History)
메뉴 경로: Setting > Management > Security > 로그인 실패 이력
시스템에 접근 실패한 사용자 IP 목록을 확인할 수 있는 화면입니다.
2. 비밀번호 암호화 / 복호화
경로: {EXEMONE_HOME}/scripts/
적용 대상: exemONE RepoDB(ClickHouse, PostgreSQL) 및 데이터로 저장된 모니터링 대상(예: xm_instance에 저장된 DB 비밀번호)
CASE 1. exemONE RepoDB 비밀번호 암호화
[원인] 보안 정책에 따라 비밀번호를 암호화된 형태로 관리해야 하나, 초기 비밀번호에서 변경 시 암호화 절차가 누락된 경우 application.yml, core.yaml, alerter.yaml 등의 설정 파일에서 평문 비밀번호가 사용됩니다.
[Step 1] 암호화 실행
# {EXEMONE_HOME}/scripts 폴더로 이동 후 실행
./crypto-cli encrypt --plaintext {평문}
출력된 암호화 값을 복사합니다.
[Step 2] 각 모듈의 설정 파일 password 항목을 암호화 값으로 변경
| 모듈 | 설정 파일 경로 |
|---|---|
| API | {EXEMONE_HOME}/containers/exemone-api/configs/application.yml |
| Core | {EXEMONE_HOME}/containers/exemone-core/configs/core.yaml |
| Alerter | {EXEMONE_HOME}/containers/exemone-alerter/configs/alerter.yaml |



[Step 3] 서비스 재구동 (Docker 환경)
exemone/scripts/restart api
exemone/scripts/restart core
exemone/scripts/restart alerter
CASE 2. 데이터로 저장된 모니터링 대상 비밀번호 복호화
수집 서버 PostgreSQL에 접속하여 복호화를 진행합니다.
# Docker 패키지의 경우
docker exec -it exemone-postgresql psql
# 바이너리 패키지의 경우
# 바이너리 패키지 설치 경로에서 service/exemone-postgresql 폴더 내 client.sh 실행
임시 비밀번호 설정 우회 방법
최초 로그인(신규 생성) 계정의 경우 비밀번호 변경이 필수이나, SSO 인증 로그인 등으로 변경이 불가능한 경우 아래와 같이 우회합니다.
1. 수집서버 PostgreSQL 접속
# Docker 패키지의 경우
docker exec -it exemone-postgresql psql
# 바이너리 패키지의 경우
# 바이너리 패키지 설치 경로에서 service/exemone-postgresql 폴더 내 client.sh 실행
2. xm_user 테이블에서 password_change 값 변경
update xm_user set password_change = false where active_user_id = '로그인 ID';
계정 패스워드 강제 변경 (암호화 값 적용):
-- Password: 0000 암호화 값 예시
update xm_user set password = '$2a$10$feDKWl/4ic./xKq./KOBxuL1ymg0G4gfCtdl4TYFlxHOqnmPxjnF6' where active_user_id = '로그인 ID';
3. PostgreSQL SSL 및 암호화 적용
[적용 대상] exemONE 내장 PostgreSQL 보안 취약점 점검 관련 SSL 및 암호화 적용
테스트 환경: 412(LTS) 및 504.15 버전: PG 13 및 17 버전에서 확인
주의: SSL 적용 없이 암호화만 적용하는 경우 Step 1(SSL 관련 설정) 및 Step 2 과정을 건너뛰고 진행합니다.

[Step 1] postgresql.conf 파일 수정
기존 주석 처리된 값의 주석을 제거합니다.
# SSL 관련 설정 주석 제거
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# 암호화 방식 지정
password_encryption = 'scram-sha-256'
[Step 2] crt 및 key 파일 생성
SSL 적용을 위한 자체 인증서를 발급하여 적용합니다.
# SSL 인증서 생성
openssl req -new -x509 -days 365 -nodes -text \
-out server.crt \
-keyout server.key \
-subj "/CN=exemone"
# server.key 권한 변경
chmod 600 server.key
[Step 3] pg_hba.conf 파일 내 host, trust 값 변경
host, trust 값을 hostssl, scram-sha-256 값으로 변경합니다.
(SSL을 적용하지 않는 경우 host로 설정)

[Step 4] postgresql 재기동
./scripts/restart.sh postgresql
[Step 5] postgres 패스워드 재설정
기존 trust, md5 등의 방식으로 설정된 경우 동일한 패스워드로 다시 설정이 필요합니다.
# pg 컨테이너 접속
docker exec -it exemone-postgresql /bin/bash
# 패스워드 입력 후 db 접속
psql -U postgres --password
# 패스워드 재설정 적용
ALTER USER postgres WITH PASSWORD 'onepass';
[Step 6] 적용 확인
exemONE 로그인, 환경설정에서 설정한 사항이 표시되는지 확인합니다.
4. Webhook Payload 암호화 (AES256)
지원 버전:
exemone-alerter v3.0.508.59
API 요청/응답 시 데이터 보안을 위해 2단계 암호화를 적용합니다.
암호화 프로세스
| 방향 | 처리 과정 |
|---|---|
| 송신 | 평문 → AES256 암호화 → Base64 인코딩 → 전송 |
| 수신 | 수신 → Base64 디코딩 → AES256 복호화 → 평문 |
암호화 키 관리:
- 단말별로 고유한 메시지 키 발급
- "메시지서버 암호화 Key 조회" API를 통해 키 획득 후 사용
[Step 1] Alerter에 암호화 Key 설정
파일 위치: ${EXEMONE_HOME}/containers/exemone-alerter/configs/alerter.yaml
log:
...
messenger-cipher:
enabled: true
# 96자리 hex 키. 첫 64자리 = AES 키, 다음 32자리 = IV 값
key: ''
[Step 2] Alerter 재구동
${EXEMONE_HOME}/scripts/restart.sh alerter
[Step 3] Notification 설정
메뉴 경로: Setting > Alert > Notification > Add/Edit Notification
- 조건 1: URL 설정 —
/massenger로 시작하는 Webhook URL일 경우, Payload data를 암호화합니다. - 조건 2: Request Header 설정 —
plain/text형식을 사용합니다.

[Step 4] Notification 전송 확인
Alert > Alert Detail > Notification Status에서 암호화된 내용으로 전송된 알람 내용을 확인할 수 있습니다.

5. TLS 설정 (Webhook Notification TLS)
지원 버전:
exemone-alerter v3.0.412.7.0
TLS를 적용하여 Webhook 알림을 전송할 수 있도록 옵션을 설정합니다.
[Docker 설치 환경]
[Step 1] EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY 옵션 추가
파일 위치: ${EXEMONE_HOME}/docker-compose.yml
alerter:
environment:
EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY: true
[Step 2] alerter 재구동
${EXEMONE_HOME}/scripts/restart.sh alerter
[Binary 설치 환경]
[Step 1] EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY 옵션 추가
파일 위치: ${EXEMONE_HOME}/services/exemone-alerter (.env 파일 추가)
EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY=true
[Step 2] alerter 재구동
${EXEMONE_HOME}/onectl restart alerter
TLS 미설정 시 발생 오류:
webhook notification failed. err:1 out of 1 requests failed: Post "고객사URL": context deadline exceeded
6. 세션 보안 (Session Security)
6-1. Session Timeout 설정
지원 버전: v3.0.409 이상
사용자 역할 권한별 Session Timeout 기능을 적용하여 설정된 시간 초과 시 자동 로그아웃 기능을 적용합니다.
[Step 1] API 설정 파일 수정
$ vi containers/exemone-api/configs/application.yml
sessionTimeoutMode: true 설정

[Step 2] Gateway 설정 파일 수정
$ vi containers/exemone-gateway/configs/gateway.yml
session-timeout-mode: true 설정

[Step 3] 역할별 Session Timeout 시간 설정
메뉴 경로: Setting > Permission > Role Permission > Add/Edit Role
옵션: Session Time

Master 권한 예외 설정: PostgreSQL(exemONE Repo DB) >
xm_role_permission테이블의session_timeout=-1설정 시 해당 역할에 세션 타임아웃 미적용

6-2. 로그인/개인정보 변경 시 세션 제거 (RSA Cache 처리)
지원 버전: front v3.0.412.8.3 이상, api v3.0.412.8.0 이상
로그인 및 개인정보 변경 시 세션이 아닌 서버에서 발행하는 별도의 키(RSA) 를 사용하도록 변경하여 세션 사용을 원천적으로 제거합니다.
[Step 1] API 설정 파일에서 rsa-cache 처리 옵션 true로 변경 후 재기동
파일 위치: $exemone_home/containers/exemone-api/configs/application.yml

[Step 2] 기존 JSESSIONID 쿠키 삭제
기존에 사용하던 JSESSIONID가 남아 있으면 쿠키에 계속 붙게 되어, 개발자 도구에서 쿠키 삭제(우클릭 > Delete)

6-3. iframe 환경에서 세션 쿠키 보안 설정
iframe 환경에서 exemONE 접속 시 크롬 등 최신 브라우저에서 세션 쿠키가 정상 전달되지 않는 경우, 아래 옵션을 적용합니다.
파일 위치: api 설정 (application.yml)
server:
servlet:
session:
cookie:
same-site: none
secure: true
주의: 해당 옵션은 HTTPS 프로토콜만 지원합니다.
7. 외부 인증(SSO) 연동 - Azure AD
메뉴 경로: exemone-gateway, exemone-api 설정 파일 수정
Azure 사용자로 exemONE에 SSO 로그인하는 기능을 제공합니다.

사전 조건: Azure > Key Vault(키 자격 모음)가 생성된 상태이며 사용자/앱에 권한이 부여된 상태여야 합니다.
[Step 1] exemone-gateway 설정 파일에 SSO 옵션 추가
파일 경로: {EXEMONE_HOME}/installer/exemone/containers/exemone-gateway/configs/gateway.yaml
gateway:
port: 8080
access-token-duration-minute: 100
keep-logged-in: true
session-timeout-mode: false
sso:
sso-path: "/" # Exemone 진입점(고정값)
authorization-path: "/sso/azure/kt" # API 서버 인증 URL(고정값)
redirection-url: "https://qs.exemone.com/sso" # SSO 인증 실패 시 Redirect URL
redirection-error-url: "https://qs.exemone.com/CUSTOM/ssoErrorPage.html"
app-domain: "https://qs.exemone.com" # 앱 도메인
azure:
redirection-url: "/azure/ad/callback" # azure ad app 콜백
client-id: "d3f990d3-5f2b-46f9-add9-df5f2aa85693" # azure app 클라이언트 아이디
tenant-id: "3fcb3298-7fc7-4c3a-953c-f2ccfab07de2" # azure app 테넌트 아이디
client-secret: ".R38Q~TLGzNuK9f49Lf7S~ybsWuLMx1uAdfW_aqc" # azure app 시크릿
vault-name: "qs-kt" # azure vault 이름
8. 보안 취약점 관련 FAQ
| 질문 | 답변 |
|---|---|
| Apache Shiro 프레임워크 사용 여부 | exemONE의 모든 모듈에서 미사용 |
| React / Next.js 사용 여부 | exemONE의 모든 모듈에서 미사용 |
| 권장 브라우저 | Chrome 122 이상 |
| 모니터 해상도 | 기본 1920×1080, 최소 1366×768 |
9. 보안 기능 메뉴/설정 경로 요약
| 보안 기능 | 메뉴/설정 경로 |
|---|---|
| 로그인 IP 접근 제어 | Setting > Management > Security > Login IP Control |
| 로그인 실패 이력 확인 | Setting > Management > Security > 로그인 실패 이력 |
| 비밀번호 암호화 실행 | {EXEMONE_HOME}/scripts/crypto-cli encrypt --plaintext {평문} |
| PostgreSQL SSL 적용 | postgresql.conf, pg_hba.conf 수정 → restart.sh postgresql |
| Webhook Payload AES256 암호화 | alerter.yaml: messenger-cipher.enabled: true |
| Webhook TLS 설정 (Docker) | docker-compose.yml: EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY: true |
| Webhook TLS 설정 (Binary) | services/exemone-alerter/.env: EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY=true |
| Session Timeout 활성화 | application.yml: sessionTimeoutMode: true + gateway.yml: session-timeout-mode: true |
| Session Timeout 시간 설정 | Setting > Permission > Role Permission > Add/Edit Role > Session Time |
| RSA 세션 제거 설정 | application.yml: rsa-cache 옵션 true |
| iframe 세션 쿠키 보안 | application.yml: same-site: none, secure: true |
| Azure AD SSO 연동 | gateway.yaml: sso 옵션 설정 |
참고 문서 URL
- 로그인 IP 접근 제어 사용 가이드: https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-2864878
- Setting > Management > Security > Login IP Control (메뉴얼): https://app.clickup.com/25540965/v/dc/rbeb5-416338/rbeb5-2736018
- 비밀번호 암호화/복호화 방법: https://app.clickup.com/25540965/v/dc/rbeb5-403538/rbeb5-2593538
- 임시 비밀번호 설정 우회 가이드: https://app.clickup.com/25540965/v/dc/rbeb5-403538/rbeb5-3112838
- PostgreSQL SSL 및 암호화 적용: https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-2842498
- Webhook Request Body 암호화 (AES256): https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-3309018
- Webhook TLS 적용 가이드: https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-3444078
- Session Timeout 설정 가이드: https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-2702198
- 로그인/개인정보 변경 시 세션 제거 설정: https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-3345518
- iframe 세션 쿠키 보안 설정: https://app.clickup.com/25540965/v/dc/rbeb5-403538/rbeb5-2771158
- SSO Azure AD 연동 가이드 (KT PoC): https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-2592458
- QA 리스트 (보안 취약점 관련): https://app.clickup.com/25540965/v/dc/rbeb5-403498/rbeb5-3449138