Files
vpd-permission-poc/docs/design/744-windows-ad-dds-end-user-mapping/cookbook.md

80 lines
5.0 KiB
Markdown

# Cookbook: OCI AD Bridge로 DDS MCP 사용자 인증 전환
[개요로 돌아가기](README.md) · [아키텍처](architecture.md) · [트러블슈팅](troubleshooting.md)
## 적용 순서
Keycloak을 삭제하지 않는다. 아래 단계를 순서대로 끝내고 Alice/Bob DDS 결과를 확인한 뒤에만 AIPF의 기본 MCP source를 OCI 경로로 바꾼다.
| 단계 | 작업 | 성공 판정 | 실패 시 |
|---:|---|---|---|
| 0 | AD·네트워크·관리 경로 점검 | AD/LDAPS/OCI HTTPS 연결 가능 | [Windows/LDAPS](troubleshooting.md#windows-ad-bridge) |
| 1 | OCI AD Bridge 생성·Windows client 설치 | Bridge `Connected` | [Windows/AD Bridge](troubleshooting.md#windows-ad-bridge) |
| 2 | AD OU/그룹 동기화 | OCI Domain에 Alice/Bob 표시 | [동기화](troubleshooting.md#동기화와-delegated-authentication) |
| 3 | delegated authentication 시험·활성화 | AD 비밀번호 로그인 성공 | [동기화](troubleshooting.md#동기화와-delegated-authentication) |
| 4 | AIPF OAuth source 등록 | OCI 로그인 → callback 완료 | [OAuth/AIPF](troubleshooting.md#oci-oauth와-aipf) |
| 5 | MCP issuer/audience·DB binding 교체 | OCI JWT 검증·DDS mapping 성공 | [MCP/DDS](troubleshooting.md#mcp와-dds) |
| 6 | Alice/Bob 비교 및 Keycloak 정리 판단 | Alice 1건, Bob 거부 | [권한](troubleshooting.md#mcp와-dds) |
## 0. 사전 점검
- AD Domain: `dds.test`
- OCI Identity Domain: `identityAPAC`
- Bridge 설치 위치: 운영은 domain-joined Windows member server 권장. 이 PoC는 격리된 AD VM에서 설치 가능 여부를 검증한다.
- 네트워크: Bridge host → OCI Domain HTTPS 443, Bridge host → AD LDAPS 636
- AD Bridge service account: 동기화 대상 OU 읽기, `cn=Deleted Objects` 읽기, delegated authentication에 필요한 password/lockout attribute 최소 권한
Windows VM에 RDP 외의 관리 경로가 없으면 installer를 RDP에서 실행한다. WinRM/OCI Run Command 상태가 불완전하면 원격 설치 수단으로 가정하지 않는다.
## 1. OCI AD Bridge 생성과 설치
1. OCI Console에서 **Identity & Security → Domains → identityAPAC → Directory integrations → Add → Microsoft Active Directory Bridge**를 연다.
2. 표시되는 **Bridge client ID/secret**과 Domain URL을 secret store에 보관한다.
3. Bridge installer를 domain-joined Windows에 설치한다.
4. installer에서 OCI Domain URL/client credential 및 AD Bridge service account를 입력한다.
5. **LDAPS**를 선택하고 연결 시험을 통과한다.
6. Directory integrations에서 사용자·그룹 OU를 최소 범위로 선택하고 initial sync를 실행한다.
Bridge client secret은 AIPF OAuth client secret 및 DB service client secret과 다르다. 각 secret을 서로 대체해 입력하지 않는다.
## 2. delegated authentication 활성화
1. OCI Domain에서 동기화된 `dds-alice`, `dds-bob`을 확인한다.
2. **Security → Delegated authentication → Test Delegated Authentication**에서 각 AD 계정/AD 비밀번호를 시험한다.
3. 두 계정이 성공한 뒤에만 `Activate Delegated Authentication`을 켠다.
이후 OCI 로그인 화면에 입력한 비밀번호는 Bridge를 거쳐 AD DS에서 검증된다. OCI Domain은 비밀번호 원천이 아니라 OIDC issuer다.
## 3. AIPF OCI OAuth client
`AIPF_DDS_AD_TEST`는 AIPF 전용 confidential client다.
| 설정 | 값 |
|---|---|
| Grant | `authorization_code`, `refresh_token` |
| Redirect URI | `https://aipf.cloud-handson.com/agentFactory/v1/tools/mcp/callback``https://aipf.cloud-handson.com/v1/tools/mcp/callback` |
| Scope | `openid profile email offline_access` |
| Authorization URL | discovery의 `authorization_endpoint` |
| Token / Refresh URL | discovery의 `token_endpoint` |
discovery URL은 `https://<identity-domain>/.well-known/openid-configuration`이다. endpoint를 추측해 입력하지 않는다. local test 환경의 client credential은 git-ignore된 `.runtime/aipf-dds-oci-ad-client.env`에만 보관한다.
## 4. AIPF source와 MCP 전환
1. AIPF에서 기존 Keycloak source를 삭제하지 않고 새 source를 만든다.
2. Server URL은 `https://hmm-backoffice.cloud-handson.com/mcp/dds/sse`를 유지한다.
3. Authentication mode를 `OAuth`로 선택하고 OCI client ID/secret과 discovery endpoint를 입력한다.
4. OCI login에서 Alice로 로그인한 뒤 받은 access token의 `iss`, `aud`, `sub`를 안전하게 확인한다.
5. MCP의 issuer/audience와 `CB_EXTERNAL_IDENTITY_BINDING`을 OCI claim 기준으로 함께 바꾼다.
6. Alice/Bob 권한 비교가 끝난 후에만 기존 source를 해제한다.
## 5. 검증과 rollback
| 검증 | 성공 |
|---|---|
| Alice `휴가` 검색 | `휴가 정책 - Alice 전용 테스트` 1건 |
| Bob 같은 검색 | 권한 없는 보호 객체가 default deny |
| 잘못된/만료/미매핑 OCI JWT | DB query 이전에 거부 |
실패 시 MCP issuer/audience와 AIPF source를 Keycloak 값으로 되돌린다. DB service client, `DDS_U_1`/`DDS_U_2`, DATA GRANT는 OCI 사용자 OAuth 전환과 별개이므로 rollback 대상이 아니다.