exemONE 보안 설정
1. 개요
exemONE은 로그인 접근 제어, 비밀번호 정책, 내부 DB 비밀번호 암호화, HTTPS/SSL 설정, 세션 보안 등 다양한 보안 설정 기능을 제공합니다.
보안 기능 분류:
| 분류 | 기능 | 설정 위치 |
|---|---|---|
| 접근 제어 | 로그인 IP 제어 | Setting > Management > Security > Login IP Control |
| 접근 제어 | 로그인 실패 이력 | Setting > Management > Security > Login Fail History |
| 비밀번호 정책 | Password Policy | Setting > Management > Security > Password Policy |
| 암호화 | RepoDB 비밀번호 암호화 | 서버 설정 파일 + crypto-cli 명령어 |
| TLS/HTTPS | Gateway HTTPS 설정 | 서버 설정 파일 (gateway.yml) |
| TLS/SSL | PostgreSQL SSL 설정 | DB 타겟 설정 (pg_hba.conf) |
| TLS | Webhook TLS 설정 | 서버 설정 파일 (docker-compose.yml / .env) |
| 세션 보안 | 세션 제거 설정 | 서버 설정 파일 (application.yml) |
적용 버전 전제 조건:
| 기능 | 적용 버전 |
|---|---|
| 로그인 IP 접근 제어 | Front v3.0.503.1.1 이상, API v3.0.503.1.4 이상 |
| 세션 제거 설정 | Front v3.0.412.8.3 이상, API v3.0.412.8.0 이상 |
| Webhook TLS | exemone-alerter v3.0.412.7.0 이상 |
| PostgreSQL SSL 및 암호화 | 412(LTS) 및 504.15 버전 / PG 13 및 17 버전 확인 |
2. 접근 제어 (Login IP Control)
2-1. 개요
메뉴 경로: Setting > Management > Security > Login IP Control
exemONE 접근 허용 IP를 설정하여 사용자별 로그인 허용 IP를 관리합니다. 등록된 IP에 대해서만 로그인이 허용됩니다.
2-2. 로그인 IP 접근 설정 방법
Step 1. 접근 허용 IP 등록
Setting > Management > Security > Login IP Control에서 [IP 추가] 를 선택하여 접근 허용 IP를 추가합니다.
- 하나의 계정이 여러 정책에 포함될 수 있으며, 하나의 정책이라도 허용 IP 조건이 맞으면 접속이 가능합니다.

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

Step 2. 사용자에 IP 접근 목록 등록
Setting > Account > User > 사용자 추가 또는 편집에서 IP 접근 제어 대상 계정에 IP 접근 목록을 등록합니다.
- IP 접근 목록에서 Active된 목록만 표시됩니다.


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

2-3. 로그인 실패 이력 (Login Fail History)
메뉴 경로: Setting > Management > Security > Login Fail History
시스템에 접근 실패한 사용자 IP 목록을 확인할 수 있는 화면입니다.

| 순번 | 항목 | 설명 |
|---|---|---|
| 1 | Fail History | 시스템에 접근 실패 이력 목록을 보여줍니다. |
| 2 | 새로고침 아이콘 | 클릭 시 새로고침된 시각 정보로 변경되고 목록이 갱신됩니다. |
| 3 | Search | 목록을 검색할 수 있습니다. |
| 4 | Login Date | 로그인 접속한 일자 |
| 4 | User ID | 사용자 ID |
| 4 | IP | 사용자가 접근한 IP 주소 |
| 4 | Description | 설명란 |
| 4 | Log | 접속 이력 로그 |
3. 비밀번호 정책 (Password Policy)
메뉴 경로: Setting > Management > Security > Password Policy
관리자가 비밀번호 정책을 관리할 수 있는 화면입니다.

| 순번 | 항목 | 설명 |
|---|---|---|
| 1 | Minimum Password Length | 숫자 입력 제한 10~64 |
| 2 | Upper Case Letters | 1개 이상의 영어 대문자 포함 |
| 3 | Lower Case Letters | 1개 이상의 영어 소문자 포함 |
| 4 | Special Characters | 1개 이상의 특수문자 포함 |
| 5 | Numbers | 1개 이상의 숫자 포함 |
| 6 | Consecutive Characters | 연속된 문자와 숫자 4자리 이상 포함 금지 |
| 7 | Repeated Characters | 동일한 문자와 숫자 4자리 이상 포함 금지 |
| 8 | Predictable Characters | ID와 이메일 등 유추하기 쉬운 계정 정보 포함 금지 |
| 9 | Excluded Keyword | 제외 키워드를 설정한 경우 비밀번호 설정에서 해당 키워드의 입력이 제한됩니다. |
4. 비밀번호 암호화 (Password Encryption)
exemONE RepoDB(Clickhouse, PostgreSQL) 및 모니터링 대상 비밀번호의 암호화/복호화 방법입니다.
도구 경로: {EXEMONE_HOME}/scripts/crypto-cli (도커 설치 기준)
4-1. CASE 1. RepoDB 비밀번호 암호화
보안 정책에 따라 설정 파일의 비밀번호를 암호화된 형태로 관리해야 하는 경우 적용합니다.
Step 1. 암호화 실행
# {EXEMONE_HOME}/scripts 폴더 이동 후 실행
./crypto-cli encrypt --plaintext {평문}
출력된 암호화 값을 복사합니다.
Step 2. 각 모듈 설정 파일에 암호화된 값 적용
| 파일 경로 | 항목 |
|---|---|
{EXEMONE_HOME}/containers/exemone-api/configs/application.yml | password 항목 변경 |
{EXEMONE_HOME}/containers/exemone-core/configs/core.yaml | password 항목 변경 |
{EXEMONE_HOME}/containers/exemone-alerter/configs/alerter.yaml | password 항목 변경 |



Step 3. 서비스 재구동
# 도커 설치 환경
./scripts/restart api
./scripts/restart core
./scripts/restart alerter
4-2. CASE 2. 모니터링 대상 비밀번호 복호화
데이터로 저장된 모니터링 대상 비밀번호(예: xm_instance에 저장된 타겟 DB 비밀번호) 확인이 필요한 경우 사용합니다.
# {EXEMONE_HOME}/scripts 폴더 이동 후 실행
./crypto-cli decrypt --ciphertext {암호화 텍스트}
주의: 암호화 파일은 외부 유출하지 않는 것을 원칙으로 합니다.
5. HTTPS / TLS 설정
5-1. Gateway HTTPS 설정
설정 파일 경로: {EXEMONE_HOME}/containers/exemone-gateway/configs/gateway.yml
Gateway 서비스에서 직접 HTTPS(TLS)를 설정하는 방법입니다.
Step 1. docker-compose.yml 수정 — gateway에 볼륨 및 포트 추가
# {EXEMONE_HOME}/docker-compose.yml
gateway:
volumes:
- $EXEMONE_HOME/certs:/home/exemone/certs # 추가
ports:
- 8443:8080 # 앞쪽 포트를 8443으로 수정

Step 2. gateway.yml에 인증서 설정 추가
# {EXEMONE_HOME}/containers/exemone-gateway/configs/gateway.yml
gateway:
cert-file: /home/exemone/certs/server.crt # 추가
key-file: /home/exemone/certs/server.key # 추가

Step 3. gateway 재시작
./scripts/restart.sh gateway
5-2. PostgreSQL SSL 설정 (모니터링 대상 DB 연결)
메뉴 경로: Setting > Database > Custom Configuration
PostgreSQL 모니터링 대상에 SSL 연결 시 클라이언트 SSL 모드를 설정합니다.
| SSL Mode | 설명 | 인증서 파일 필요 여부 |
|---|---|---|
require | SSL 암호화 사용. 서버 인증서의 CA 검증 없음 | 불필요 |
verify-ca | require + 서버 인증서가 신뢰할 수 있는 CA에 의해 발급되었는지 확인 | 서버의 공개키 파일 필요 |
verify-full | verify-ca + 인증서의 호스트 이름 일치 여부도 확인 | 서버의 공개키 파일 필요 |
5-3. PostgreSQL RepoDB SSL 및 암호화 적용 (보안취약점 점검 대응)
적용 대상: exemONE 내부 RepoDB (PostgreSQL)
적용 환경: 412(LTS) 및 504.15 버전 / PG 13 및 17 버전
참고: SSL 적용 없이 암호화만 적용하는 경우 Step 1~2 (SSL 관련 설정)를 건너뛰고 Step 3부터 진행합니다.
Step 1. postgresql.conf 파일 수정
# SSL 관련 설정 주석 제거
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
# 암호화 방식 지정
password_encryption = 'scram-sha-256'
Step 2. 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 값을 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-postgresql 로그 확인
docker logs -f exemone-postgresql
| 오류 로그 | 원인 및 조치 |
|---|---|
[FATAL] ~ no encryption | postgres 암호 방식이 변경된 방식(scram-sha-256)으로 적용되지 않은 경우. "postgres 패스워드 재설정"을 진행합니다. |
5-4. Webhook TLS 설정
지원 버전: exemone-alerter v3.0.412.7.0 이상
TLS를 적용하여 Webhook 알림을 전송할 수 있도록 옵션을 설정합니다.
도커 설치 환경
파일 경로: ${EXEMONE_HOME}/docker-compose.yml
alerter:
environment:
EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY: true
# alerter 재구동
${EXEMONE_HOME}/scripts/restart.sh alerter
바이너리 설치 환경
파일 경로: ${EXEMONE_HOME}/services/exemone-alerter/.env
EXEMONE_WEBHOOK_NOTIFIER_INSECURE_SKIP_VERIFY=true
# alerter 재구동
${EXEMONE_HOME}/onectl restart alerter
관련 이슈: 해당 설정이 되지 않은 경우, alerter에서 아래 오류가 발생될 수 있습니다.
webhook notification failed. err:1 out of 1 requests failed: Post "고객사URL": context deadline exceeded
6. 세션 보안 설정
메뉴 경로 (설정 파일): {EXEMONE_HOME}/containers/exemone-api/configs/application.yml
적용 버전: Front v3.0.412.8.3 이상 / API v3.0.412.8.0 이상
로그인 및 개인정보 변경 시 세션이 아닌 서버에서 발행하는 별도의 키를 사용하도록 변경하여 세션 사용을 원천적으로 제거하는 기능입니다.
Step 1. api 설정 파일에서 rsa-cache 처리 옵션 true로 변경 후 재기동
# {EXEMONE_HOME}/containers/exemone-api/configs/application.yml
xm:
rsa-cache: true

Step 2. 기존 JSESSIONID 쿠키 삭제
기존에 사용하던 JSESSIONID가 남아 있으면 쿠키에 계속 붙게 되어, 브라우저 개발자 도구에서 쿠키 삭제가 필요합니다. (우클릭 > Delete)

7. 주의사항 / 참고
| 항목 | 내용 |
|---|---|
| IP 접근 제어 버전 | Front v3.0.503.1.1, API v3.0.503.1.4 이상에서만 지원 |
| 암호화 파일 외부 유출 금지 | 복호화 키 파일은 외부로 유출하지 않는 것을 원칙으로 합니다. |
| PostgreSQL SSL 적용 시 패스워드 재설정 | SSL 및 scram-sha-256 적용 후 기존 패스워드를 동일한 값으로 재설정해야 합니다. |
| Webhook TLS 미설정 시 오류 | context deadline exceeded 오류 발생 시 INSECURE_SKIP_VERIFY 옵션 설정 필요 |
| Gateway HTTPS 설정 시 별도 https 모듈 제거 | 기존 별도 https 컨테이너를 사용 중이었다면 제거 후 gateway로 일원화합니다. |
| 세션 제거 설정 적용 버전 | Front v3.0.412.8.3, API v3.0.412.8.0 이상에서만 지원 |
| PostgreSQL SSL 테스트 환경 | 412(LTS) 및 504.15 버전 / PG 13 및 17 버전에서 확인된 설정 방법입니다. |
참고 문서: