Adapter 설정 가이드
Adapter 설정 가이드
Adapter 환경설정 파일에 대한 설명입니다. ADFS Adapter 적용하기 전에 반드시 환경설정을 먼저 해야 합니다.
주의
adapter 설치위치 변경 사항
adapter 1.2.0.6부터 C 드라이브 이외의 다른 드라이브에 설치가 가능합니다.
- 기존 : C:/ADFSadapter 에만 설치
- 변경 : C to Z 드라이브의 root에 설치
- 예시: C:/ADFSadapter , D:/ADFSadapter , E:/ADFSadapter , …… , Z:/ADFSadapter
- 주의사항 : 단 1개의 드라이브에만 설치해야 하며, 만일 여러 개의 드라이브에 설치된 경우 C to Z 스캔하면서 가장 먼저 발견된 디렉토리를 사용함
아래의 예시는, adapter를 C:\ADFSadapter 디렉토리에 설치한 경우입니다.
C 이외의 다른 드라이브에 설치한 경우, 아래의 예시에서 드라이브명(drive letter)만 변경하면 됩니다.
- 예시: D:\ADFSadapter 에 설치한 경우 ini 경로 → D:\ADFSadapter\ADFSadapter.ini
파일명 및 경로
- 파일명: ADFSadapter.ini
- 전체 경로: C:\ADFSadapter\ADFSadapter.ini
- 파일 인코딩: 반드시 UTF-8 로 저장할 것 (한글이 깨짐현상 발생)
알아두어야 할 점
* 값을 표현할때 "와" 를 사용할 수 있으며 = 좌우에 빈칸을 입력해도 됩니다.
+ Value 의 앞뒤에 있는 공백은 Trim 처리 됩니다.
+ 아래의 Value는 모두 동일함
+ 예1) MAIN_TITLE = DWP MFA Adapter
+ 예2) MAIN_TITLE = DWP MFA Adapter
+ 예3) MAIN_TITLE = "DWP MFA Adapter"
+ 예4) MAIN_TITLE = " DWP MFA Adapter "
* 섹션 이름들 중에 뒷부분에 -1033, -1042 가 붙는 것들은 locale 을 의미합니다.
+ 최소한 1033 은 반드시 있어야 합니다.
+ locale number : 1033 (en-us), 1042 (ko)
+ locale section : MFA-1033, MFA-1042, TXT-1033, TXT-1042, MSG-1033, MSG-1042
ini 파일 구조 예시
아래의 설정 값 예시 중에 보안 목적으로 masking 한 값들이 있으며, 실제 값은 asterisk 가 아닙니다.
# ADFS MFA Adapter 환경 설정
# 설치위치 변경 사항
# - v1.2.0.6 이전 : C:\ADFSadapter\ADFSadapter.ini
# - v1.2.0.6 부터 : C 이외의 다른 드라이브에 설치할 수 있음 (adapter 리소스 설치한 위치와 동일)
# 예시: C:\ADFSadapter\ADFSadapter.ini , D:\ADFSadapter\ADFSadapter.ini , E:\ADFSadapter\ADFSadapter.ini
# 주의 : DLL 파일명은 ADFSadapter.dll 이며, 기존의 Nexsign 연계한 MFAadapter.dll과는 다름
# 값을 표현할때 " 와 ' 를 사용할 수 있으며 = 좌우에 빈칸을 입력해도 됩니다
# Value 의 앞뒤에 있는 공백은 Trim 처리 됩니다.
# 아래의 Value는 모두 동일합니다.
# 예1) MAIN_TITLE=ADFS MFA Adapter
# 예2) MAIN_TITLE = ADFS MFA Adapter
# 예3) MAIN_TITLE = "ADFS MFA Adapter"
# 예4) MAIN_TITLE = " ADFS MFA Adapter "
# 섹션 이름들 중에 뒷부분에 -1033, -1042 가 붙는 것들은 locale 을 의미합니다
# 최소한 1033 은 반드시 있어야 합니다
# locale number : 1033 (en-us), 1042 (ko)
# locale section : MFA-1033, MFA-1042, TXT-1033, TXT-1042, MSG-1033, MSG-1042
# LOG_LEVEL (Windows 이벤트 로그에 기록하는 기준)
# 0 : Error
# 1 : Error + Warning
# 2 : Error + Warning + Information + Debug
[MAIN]
MAIN_MFA_TITLE="ADFS MFA Adapter"
MAIN_CLAIM1=http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod
MAIN_CLAIM2=http://schemas.microsoft.com/ws/2012/12/authmethod/otp
# MFA API 정보
# URL 끝부분에 "/" 붙이지 말 것
#MFA_API_URL="https://stg2-cloud.singleid.samsung.net/test/common-api/open/v1.1/mfa/request"
MFA_API_URL="https://stg1-cloud.singleid.samsung.net/test/common-api/open/v1.1/mfa/request"
CONSUMER_KEY="**************************************"
SECRET_KEY="**************************************"
# Donmain vs Consumer Key 리스트
# 도메인별로 Consumer Key가 다른 경우에는 리스트로 나열 (이런 경우, 위의 CONSUMER_KEY 값을 비울 것)
# Reqeust Token의 sys 값에 대입
# 형태 : DOMAIN_CONSUMER_KEY_##=domain;consumerKey
# 예시: DOMAIN_CONSUMER_KEY_01=aaa.com;**************************************
# DOMAIN_CONSUMER_KEY_02=bbb.com;**************************************
# (주의) CONSUMER_KEY 값과 리스트 값이 모두 있다면, CONSUMER_KEY 값만 사용함
DOMAIN_CONSUMER_KEY_01=aaa.com;**************************************
DOMAIN_CONSUMER_KEY_02=bbb.com;**************************************
# Donmain vs Secret Key 리스트
# 도메인별로 Secret Key가 다른 경우에는 리스트로 나열 (이런 경우, 위의 SECRET_KEY 값을 비울 것)
# 형태 : DOMAIN_SECRET_KEY_##=domain;secretKey
# 예시: DOMAIN_SECRET_KEY_01=aaa.com;**************************************
# DOMAIN_SECRET_KEY_02=bbb.com;**************************************
# (주의) SECRET_KEY 값과 리스트 값이 모두 있다면, SECRET_KEY 값만 사용함
DOMAIN_SECRET_KEY_01=aaa.com;**************************************
DOMAIN_SECRET_KEY_02=bbb.com;**************************************
# LDAP Search 결과에 따른, MFA 진행 여부
# 0 : LDAP Search를 하지 않음 (아래의 LDAP_SERVER, LDAP_USE_IDPW, ... 등의 정보 사용하지 않음. token에는 빈 값 대입)
# 1 : LDAP Search를 시도하지만 실패해도 관계없음 (서버 실패, 정보 없음 등이 발생하여도 MFA 진행함. token에는 빈 값 대입)
# 2 : LDAP Search가 성공 & 사용자 정보가 존재해야 함 (사용자 정보가 존재할 경우에만 진행함. 단, 결과 값이 빈 값이어도 진행함)
USE_LDAP_SEARCH=1
# LDAP 주소와 ID/PW
# LDAP_SERVER는 domain, ipv4, ipv6 등의 3가지 모두 가능하며, 앞부분에 대문자 "LDAP://" 을 붙여야 함 (반드시 대문자)
# 예시: LDAP://adpw5004.hw.dev , LDAP://70.2.180.218 , LDAP://fe80::644b:3c9f:c5ac:ce1c%10
# ID/PW를 사용하려면 LDAP_USE_IDPW 값을 1, 사용하지 않으려면 LDAP_USE_IDPW 값을 0 으로 설정
# SSL/TLS 사용하려면 LDAP_SSLTLS 값을 1, 사용하지 않으려면 LDAP_SSLTLS 값을 0 으로 설정 (단, LDAP_USE_IDPW=1 인 경우에만 해당)
LDAP_SERVER="LDAP://adpw5004.hw.dev"
LDAP_USE_IDPW=1
LDAP_SSLTLS=1
LDAP_ID="isadmin"
LDAP_PW="sds*****"
# DNS Lookup을 하여 LDAP 서버(LDAP_SERVER)의 IP 주소를 확인하고, IP 주소 기반으로 접속 여부
# LDAP_SERVER 값이 IP(ipv4, ipv6)로 설정되어 있어도 DNS Lookup을 수행하며, IP 그대로 리턴됨
# 만약, DNS Lookup을 실패하면, LDAP_SERVER 값 그대로 접속
# 0 : LDAP_SERVER 값 그대로 서버에 접속 (DNS lookup 하지 않음)
# 1 : DNS lookup으로 IP 주소를 확인하여 LDAP 서버에 접속 (DNS lookup 결과 리스트에서 첫번째 IP 사용)
# 2 : DNS lookup으로 IP 주소를 확인하고, LDAP_WHITE_IP_## 리스트에서 가장 먼저 해당되는 IP를 사용 (리스트에 없으면, LDAP_SERVER 사용)
# 3 : DNS lookup으로 IP 주소를 확인하고, LDAP_WHITE_IP_## 리스트에서 가장 먼저 해당되는 IP를 사용 (리스트에 없으면, LDAP 접속 안함)
LDAP_DNS_LOOKUP=1
# DNS Lookup 결과가 여러 개일때, 첫번째 IP 주소로 연결이 안되면 그 다음 IP 주소로 시도할지 여부
# 예시: lookup 결과가 4개 : 1차 IP 연결 실패 -> 2차 IP 연결 시도 & 싪패 -> 3차 IP 연결 시도 & 싪패 -> 4차 IP 연결 시도
LDAP_DNS_IF_FAIL_USE_NEXT=1
# DNS Lookup 결과와 비교하는 접속 허용된 LDAP 서버 IP 리스트 (LDAP_DNS_LOOKUP = 2 or 3 인 경우에만 해당)
# LDAP_WHITE_IP_## 형태이며, 01부터 99까지 순차적으로 기록
# DNS Lookup 결과와 리스트를 순차적으로 비교
# IPv4, IPv6 형태로 기록 (동일한 서버의 IPv4, IPv6가 있다면 리스트의 앞순위에 있는 IP가 적용됨)
# DNS Lookup 결과 순서와 White IP 리스트 순서가 다르다면 -> White IP 리스트 순서를 따름
LDAP_WHITE_IP_01="70.2.180.218"
LDAP_WHITE_IP_02="fe80::644b:3c9f:c5ac:ce1c%10"
# 사용자 정보를 암호화할지 여부 (예: mobile, email 등)
# 대상 : USERINFO_## 리스트
# 암호화 여부에 따라 API 서버에 전송하는 token의 claim 이름이 다름
# 0 : 암호화 하지 않음 -> token의 claim 이름이 plainMobile, plainEmail
# 1 : 암호화 -> token의 claim 이름이 mobile, email
USERINFO_ENCRYPT=0
# LDAP Search할 사용자 정보 attribute name과 JWT token에 사용할 claim name (2개 값을 구분하는 delimeter = ";")
# 형태: USERINFO_## = attribute;encryptedClaim;plainClaim
# 예시: LDAP에서 "mail" 속성을 읽어서, JWT에 "email" claim으로 사용된다면 -> "mail;email;plainEmail"
# key 명칭은 "USERINFO_##" 형태로 하고, 시작은 USERINFO_01
# key 갯수 : 0개 ~ 최대 99개 (0개인 경우, ini에 아무것도 적지 않으면 되며, USERINFO_00 이라고 적지 말 것)
# 주의사항) USERINFO_##에서 ## 에 해당되는 숫자는 반드시 01부터 시작하며, 여러 개인 경우 번호가 끊어지지 않아야 함
# USERINFO_01, USERINFO_02, USERINFO_03 : OK (01, 02, 03 정보가 사용됨)
# USERINFO_01, USERINFO_02, USERINFO_05 : 02까지 읽고, 끊어진 번호 이후는 사용하지 않음 (01, 02 정보가 사용됨)
USERINFO_01=mobile;mobile;plainMobile
USERINFO_02=mail;email;plainEmail
# MFA API 서버가 Callback 해줄때, 결과 Parameter에 사용되는 Key 이름
# 예시: https://adpw5004.hw.dev/adfs/ls?client-request-id=xxxxxx&pullStatus=0&jwtTokenResponse=yyyyyy
KEY_NAME_IN_RESPONSE="jwtTokenResponse"
# JWT Token의 exp에 적용될 더하기 값
# 형테 : 일시분초(dhms) 형태의 문자열 -> 1d=86400, 1h=3600, 1m=60 (dhms 가 전혀 없는 단순 숫자는 초로 판단함)
# 예시1 : 1d02h38m27s -> 95907 초
# 예시2 : 12345 -> 12345 초
TOKEN_EXP_TIME=1d
# API 호출할때 구성하는 token에 client claim을 추가할지 여부
# client : SAML인 경우 issuer, OIDC인 경우 client-id
# 0 : token에 client 포함시키지 않음
# 1 : token에 client 포함
TOKEN_CLAIM_CLIENT=0
# MFA nonce(guid, requset-id) 검증 방법
# 0 : 검증 안함
# 1 : adapter가 생성한 guid를 LDAP에 저장/비교하는 방식 (adapter가 검증)
# -> 관련 설정 값 : CACHE_ATTRIBUTE, CACHE_DELIMETER, SKEW_SECONDS, CACHE_LIFE_TIME
# 2 : API 서버가 생성한 requeset-id를 adapter가 받아서 호출 URL에 사용하는 방식 (API 서버가 검증)
# -> 관련 설정 값 : MFA_VERIFY_URL
MFA_VERIFY_TYPE=2
# MFA 결과검증 URL (서버 to 서버 통신) : URL 뒷부분에 API 서버로부터 받은 {request-id}를 덧붙여서 호출함
# adapter는 리턴 200 (OK) 인지 확인하여 MFA 결과 처리
# URL 끝부분에 "/" 붙이지 말 것
MFA_VERIFY_URL="https://stg1-cloud.iam.samsung.net/test/common-api/open/v1.1/mfa/request/status"
# MFA 결과검증할때 사용할 보안 프로토콜
# 선택 가능한 프로토콜 (대소문자 구분 없음) : TLS12, TLS13
# (주의) SSL3, TLS, TLS11 은 사용하지 않음
MFA_VERIFY_SECURE_PROTOCOL="TLS12"
# 사용자의 req guid 값을 저장할 LDAP attribute의 이름
# (주의) LDAP에 write 권한이 있어야 함
CACHE_ATTRIBUTE="otherPager"
# LDAP에 저장하는 req + 시간 정보를 조합할때 사용하는 delimeter -> "req;시간"
CACHE_DELIMETER=";"
# LDAP에 저장된 req의 시간과 JWT 수신시 시간의 차이 허용치 (초단위)
# MFA 선택화면 누를 때가 아니라, AD 로그인 직후의 시간이므로 (MFA 선택화면 보일때 이미 시간이 저장되었음)
# 사용자가 MFA 선택화면 누르고 Passcode 입력할 때까지의 시간이 아님
# 따라서, tight 하게 시간을 설정하면 안되며, 1시간 정도가 적당?? (MFA 선택을 1시간 고민하는 사람이 있나?)
SKEW_SECONDS=3600
# LDAP에 저장된 req의 수명 -> 다음 access시 시간 확인해서 이전의 오래된 것들 삭제
# 형태 : 일시분초(dhms) 형태의 문자열 -> 1d=86400, 1h=3600, 1m=60 (dhms 가 전혀 없는 단순 숫자는 초로 판단함)
# 예시1 : 1d02h38m27s -> 95907 초
# 예시2 : 12345 -> 12345 초
CACHE_LIFE_TIME=1d
# Adapter 기능을 ByPass 할 것인지 여부 (0=정상 사용, 283901=무력화, 그 외 값들=정상 사용)
# MFA 기능 문제로 급하게 adapter 기능의 무력화가 필요한 비상 상황에서 사용
# 평상시에는 절대로 수정하지 말 것 -> 평상시 값은 0
# 주의 : 무력화하려면 반드시 정확한 값을 설정해야 함 (0 이외의 숫자가 해당되는 것이 아니며 정확한 숫자 필요함. noise 우려)
BYPASS_ADAPTER=0
[API]
API_SYSTEMNAME=SingleID
[MSG-1033]
MSG_INTERNAL_ERROR="Internal error occurred. Contact administrator."
[MSG-1042]
MSG_INTERNAL_ERROR="Internal error occurred. Contact administrator."
[MANAGE]
LOG_LEVEL=2
설정 값 설명
- 값 고정 : 하단 테이블의 설정 값 컬럼에 표시된 값을 ADFS 서버에 설치시에도 그대로 사용한다는 의미합니다.
- 영문, 한국어 이외의 언어를 추가하고자 한다면, 2개 Section에 대해서는 추가가 가능합니다.
- MSG-1033, MSG-1042
| dss | Key | 설정 값 (예시) | 값 고정 | 설명 |
|---|---|---|---|---|
| MAIN | MAIN_MFA_TITLE | ADFS MFA Adapter | O | HTML 페이지 타이틀 (MFA 기능에 영향 없음) |
| MAIN_CLAIM1 | http://schemas.microsoft.com/ws/2008/06/identity/claims/authenticationmethod | O | 반드시 좌측 값을 그대로 적용할 것 | |
| MAIN_CLAIM2 | http://schemas.microsoft.com/ws/2012/12/authmethod/otp | O | 반드시 좌측 값을 그대로 적용할 것 | |
| MFA_API_URL | https://stg2-cloud.singleid.samsung.net/test/common-api/open/v1.1/mfa/request | SingleID MFA API 주소
| ||
| CONSUMER_KEY | 4312a8b9-75c4-7897-89a7-89347f18943e | SingleID 로부터 발급받은 Consumer Key | ||
| SECRET_KEY | gQgkyLVO6FR8vJkLtlgBiupsRM/ilgrbEfoKWRnhALd= | SingleID 로부터 발급받은 Secret Key
| ||
| DOMAIN_CONSUMER_KEY_01 | 4312a8b9-75c4-7897-89a7-89347f18943e | Donmain vs Consumer Key 리스트
| ||
| DOMAIN_CONSUMER_KEY_02 | 96567780-2b12-23da-637c-9375a6502d5a | |||
| DOMAIN_CONSUMER_KEY_## | 367c89d5-88f7-978a-9739-8ed21748f36b | |||
| DOMAIN_SECRET_KEY_01 | gQgkyLVO6FR8vJkLtlgBiupsRM/ilgrbEfoKWRnhALd= | Donmain vs Secret Key 리스트
| ||
| DOMAIN_SECRET_KEY_02 | kgkWRnLygQhsRgrLVbtKlO6FiLdABupEgoMR8v/ilfJ= | |||
| DOMAIN_SECRET_KEY_## | dABupkRnLygQhsrLgWVRbt8vRgkLilLKlO1FioMgfJE= | |||
| USE_LDAP_SEARCH | 0 or 1 or 2 | LDAP Search 결과에 따른, MFA 진행 여부
| ||
| LDAP_SERVER | LDAP://adpw5004.hw.dev | AD 사용자 정보를 Query 할 수 있는 LDAP 주소
| ||
| LDAP_USE_IDPW | 0 or 1 | LDAP 접속시 id/pw를 사용하는지 여부
| ||
| LDAP_SSLTLS | 0 or 1 | LDAP 연결시 SSL/TLS를 사용할지 여부
| ||
| LDAP_ID | LDAP 접속 id | LDAP 접속 id (LDAP_USE_IDPW=1 인 경우) | ||
| LDAP_PW | LDAP 접속 pw | LDAP 접속 pw (LDAP_USE_IDPW=1 인 경우) | ||
| LDAP_DNS_LOOKUP | 0 or 1 or 2 or 3 | DNS Lookup을 하여 LDAP 서버(LDAP_SERVER)의 IP 주소를 확인하고, IP 주소 기반으로 접속 여부
| ||
| LDAP_DNS_IF_FAIL_USE_NEXT | 0 or 1 | DNS Lookup 결과가 여러 개일때, 첫번째 IP 주소로 연결이 안되면 그 다음 IP 주소로 시도할지 여부
| ||
| LDAP_WHITE_IP_01 | 70.2.180.218 | DNS Lookup 결과와 비교하는 접속 허용된 LDAP 서버 IP 리스트 (LDAP_DNS_LOOKUP = 2 or 3 인 경우에만 해당)
| ||
| LDAP_WHITE_IP_02 | fe80::644b:3c9f:c5ac:ce1c%10 | |||
| LDAP_WHITE_IP_## | A. : 01 ~ 99 White IP 주소 (IPv4 or IPv6) | |||
| USERINFO_ENCRYPT | 0 or 1 | 사용자 정보를 암호화할지 여부 (예: mobile, email 등)
| ||
| USERINFO_01 | mobile;mobile;plainMobile | O | LDAP Search할 사용자 정보 attribute name과 JWT token에 사용할 claim name (3개 값을 구분하는 delimeter = “;”)
| |
| USERINFO_02 | mail;email;plainEmail | O | ||
| USERINFO_## | A. : 01 ~ 99 [LDAP attribute name];[encrypted token claim name];[plain token claim name] | |||
| KEY_NAME_IN_RESPONSE | jwtTokenResponse | O | MFA API 서버가 Callback 해줄때, 결과 Parameter에 사용되는 Key 이름 | |
| TOKEN_EXP_TIME | 1d | JWT Token의 exp에 적용될 더하기 값
| ||
| TOKEN_CLAIM_CLIENT | 0 or 1 | API 호출할때 구성하는 token에 client claim을 추가할지 여부
| ||
| MFA_VERIFY_TYPE | 0 or 1 or 2 | MFA nonce(guid, requset-id) 검증 방법
| ||
| MFA_VERIFY_URL | https://stg1-cloud.iam.samsung.net/test/common-api/open/v1.1/mfa/request/status | MFA 결과검증 URL (서버 to 서버 통신) : URL 뒷부분에 API 서버로부터 받은 {request-id}를 덧붙여서 호출함 → adapter는 리턴 200 (OK) 인지 확인하여 MFA 결과 처리
| ||
| MFA_VERIFY_SECURE_PROTOCOL | TLS12 or TLS13 | MFA 결과검증할때 사용할 보안 프로토콜
| ||
| CACHE_ATTRIBUTE | otherPager | O | 사용자의 req guid 값을 저장할 LDAP attribute의 이름 | |
| CACHE_DELIMETER | “;” | LDAP에 저장하는 req + 시간 정보를 조합할때 사용하는 delimeter -> “req;시간” | ||
| SKEW_SECONDS | 3600 | LDAP에 저장된 req의 시간과 JWT 수신시 시간의 차이 허용치 (초단위)
| ||
| CACHE_LIFE_TIME | 1d | LDAP에 저장된 req의 수명 -> 다음 access시 시간 확인해서 이전의 오래된 것들 삭제
| ||
| BYPASS_ADAPTER | 0 or 283901 | Adapter 기능을 ByPass 할 것인지 여부 (0=정상 사용, 283901=무력화, 그 외 값들=정상 사용)
| ||
| API | API_SYSTEMNAME | SingleID | O | (MFA 기능에 영향 없음) |
| MSG-1033 | MSG_INTERNAL_ERROR | “Internal error occurred. Contact administrator.” | 인증중단, 오류발생 등으로 진행을 멈출때 사용자에게 보여주는 메시지 (영문) | |
| MSG-1042 | MSG_INTERNAL_ERROR | “Internal error occurred. Contact administrator.” | 인증중단, 오류발생 등으로 진행을 멈출때 사용자에게 보여주는 메시지 (한글)
| |
| MANAGE | LOG_LEVEL | 0 또는 1 또는 2 | 윈도우 이벤트 로그에 기록하는 기준
|
표. 설정값 설명