refs #744: document verified AD Bridge sync recovery

This commit is contained in:
devmrko
2026-08-05 14:50:14 +09:00
parent ad1e4573a9
commit c519435266
3 changed files with 50 additions and 2 deletions

View File

@@ -27,7 +27,8 @@ flowchart LR
| `dds-alice``휴가` 검색 | `휴가 정책 - Alice 전용 테스트` 1건 반환 |
| `dds-bob`의 같은 검색 | DATA GRANT 없음으로 default deny (`ORA-00942` 은닉) |
| OCI AIPF OAuth client | `AIPF_DDS_AD_TEST` 생성 및 OIDC discovery 확인 완료 |
| OCI AD Bridge / delegated authentication | Windows Bridge client 설치·동기화 전 |
| OCI AD Bridge client / AD 동기화 | 설치 완료 · Alice/Bob 2명과 `DDS-DDS-Users` 1개 import 성공 |
| OCI delegated authentication | AD 비밀번호 테스트·활성화 전 |
## 핵심 결정

View File

@@ -23,6 +23,8 @@ Keycloak을 삭제하지 않는다. 아래 단계를 순서대로 끝내고 Alic
- 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 최소 권한
- 동기화 대상은 기본 `CN=Users` container가 아니라 Bridge가 선택 가능한 OU에 둔다. 이 PoC는 `OU=Users,OU=DDS-PoC,DC=dds,DC=test``OU=Groups,OU=DDS-PoC,DC=dds,DC=test`를 사용한다.
- OCI User 생성에 필요한 AD 사용자 속성은 최소 `sAMAccountName`, Given Name, Surname, `mail`이다. `mail`은 OCI가 허용하는 RFC 5322 형식의 주소여야 하며, `.test` 같은 내부 TLD는 거부될 수 있다.
현재 PoC Windows VM은 WinRM HTTPS(5986) 원격 실행이 확인됐다. OCI Run Command는 여전히 `ACCEPTED`에 머물 수 있으므로 installer 실행 수단으로 사용하지 않고 WinRM을 사용한다.
@@ -69,6 +71,44 @@ Bridge client secret은 AIPF OAuth client secret 및 DB service client secret과
성공 후에만 [2. delegated authentication 활성화](#2-delegated-authentication-활성화)로 진행한다. silent response file을 확보한 경우에도 secret을 response file에 평문 보관하지 않으며, 사용 직후 삭제·rotation 절차를 적용한다.
### 1.3 LDAPS 인증서와 동기화 범위 구성
Bridge installer의 `LDAP server is unavailable`은 TCP 636이 열려 있더라도 AD DS가 유효한 LDAPS 인증서를 제공하지 않을 때 발생할 수 있다. PoC에서는 AD DS FQDN인 `hmm-ad-dss-test.dds.test`를 CN/SAN으로 하는 private server certificate를 Local Machine `My`에 설치하고, Bridge host의 Trusted Root에도 신뢰시켰다. AD DS가 새 인증서를 선택하도록 재부팅한 후 FQDN 기준 TLS handshake를 확인한다.
```powershell
$fqdn = 'hmm-ad-dss-test.dds.test'
$cert = New-SelfSignedCertificate -DnsName $fqdn, 'hmm-ad-dss-test' `
-CertStoreLocation 'Cert:\LocalMachine\My' -Type SSLServerAuthentication
Export-Certificate -Cert $cert -FilePath 'C:\DDS\certs\dds-ad-ldaps-root.cer'
Import-Certificate -FilePath 'C:\DDS\certs\dds-ad-ldaps-root.cer' `
-CertStoreLocation 'Cert:\LocalMachine\Root'
```
운영에서는 self-signed 인증서 대신 사내 CA가 발급한 인증서를 사용한다. `ad.cloud-handson.com` 같은 OIDC 공개 로그인 주소는 LDAPS server name이 아니다. Bridge의 AD 연결은 내부 AD FQDN과 TCP 636을 사용한다.
Bridge의 OU 선택 화면은 **OU만** 표시하고 기본 `CN=Users` container는 표시하지 않는다. 테스트 계정이 기본 container에 있으면 다음과 같이 전용 OU와 그룹을 만든 뒤 이동한다.
```text
DC=dds,DC=test
└─ OU=DDS-PoC
├─ OU=Users ← dds-alice, dds-bob
└─ OU=Groups ← DDS-DDS-Users
```
`Edit configuration`에서 Users pane에는 `Users`, Groups pane에는 `Groups`만 선택한다. 상위 `dds.test` 또는 `DDS-PoC`를 Include hierarchy와 함께 선택하면 모든 하위 OU가 자동 선택되므로 선택하지 않는다. Supported operations의 AD 역방향 변경 항목은 모두 해제한다. import frequency를 설정하고, delegated authentication을 사용할 계획이면 **Enable local authentication**을 선택하고 **Enable federated authentication**은 해제한다. `Save` 뒤의 **Save Configuration Changes? → OK**까지 눌러야 상태가 `Configured`가 된다.
### 1.4 Import와 사용자 속성 검증
Bridge Action 메뉴의 **Import** 또는 configuration 저장으로 full sync를 실행한다. 성공 판정은 OCI Console의 Last import status에서 `Users imported from Active directory = 2`, `Groups imported from Active directory = 1`, failed 값이 모두 `0`인 것이다.
| AD 사용자 속성 | PoC 예시 | OCI 매핑 목적 |
|---|---|---|
| `sAMAccountName` | `dds-alice` | OCI User Name |
| Given Name / Surname | `Alice` / `DDS` | OCI 필수 `name` |
| `mail` | `dds-alice@cloud-handson.com` | OCI Primary Email |
속성을 보완한 뒤에도 이전 실패 사용자가 재시도되지 않으면 Users/Groups OU 선택을 모두 해제해 Save/OK하고, 다시 필요한 OU만 선택해 Save/OK한다. 이 절차는 full sync를 강제한다. 성공 여부는 OCI Domain Users/Groups와 [동기화 문제 해결](troubleshooting.md#동기화와-delegated-authentication)을 함께 확인한다.
## 2. delegated authentication 활성화
1. OCI Domain에서 동기화된 `dds-alice`, `dds-bob`을 확인한다.

View File

@@ -9,7 +9,8 @@
| WinRM HTTPS TCP/5986 `Connection timed out` | OCI NSG에 관리 workstation `/32`의 TCP 5986 인바운드가 있는지 먼저 확인한다. 규칙을 추가한 뒤에도 timeout이면 Windows 내부 listener/firewall 문제다. | RDP에서 `winrm enumerate winrm/config/listener`, `Get-NetFirewallRule -DisplayGroup 'Windows Remote Management'`로 확인하고 HTTPS listener와 방화벽 rule을 구성한다. Bridge 자체 오류가 아니다. |
| OCI Run Command plugin은 `RUNNING`인데 command가 `ACCEPTED`/`VISIBLE` | 단순 `echo`도 실행되지 않으면 script 문제가 아님 | Windows Oracle Cloud Agent/Run Command service, outbound OCI 연결, plugin log를 RDP에서 점검한다. |
| AD Bridge installer가 `/quiet`에서 `No response file specified for silent install`으로 종료 | 이 WiX 기반 버전은 silent 설치에 response file이 필수다. | 임의의 response file을 만들지 말고 RDP의 관리자 설치 UI로 진행한다. 검증된 response file을 확보한 경우에만 secret 보관/삭제 정책을 적용해 자동화한다. |
| LDAPS certificate 오류 | Bridge host가 AD DS server/CA certificate를 신뢰하는지 확인 | CA chain을 Windows trust store에 배포하고 LDAPS를 유지한다. |
| installer에서 `LDAP server is unavailable` | TCP 636 open만 확인하지 말고 AD DS FQDN으로 TLS handshake를 시험한다. handshake가 즉시 종료되면 AD DS LDAPS certificate 문제다. | AD DS FQDN CN/SAN, Server Authentication EKU, private key를 갖춘 certificate를 Local Machine `My`에 설치하고 issuer를 Bridge host Trusted Root에 신뢰시킨 뒤 AD DS 재시작/VM 재부팅한다. |
| LDAPS certificate 오류 | Bridge host가 AD DS server/CA certificate를 신뢰하는지 확인 | CA chain을 Windows trust store에 배포한다. OIDC 공개 hostname이 아니라 실제 AD DS FQDN을 certificate와 LDAP endpoint에 사용한다. |
| Bridge `Connected`가 되지 않음 | OCI 443, AD 636, Bridge service account credential/권한 확인 | NSG/proxy/firewall 및 최소 AD 권한을 순서대로 점검한다. |
## Windows 원격 관리 경로가 막힌 경우
@@ -32,6 +33,12 @@ HTTPS listener가 없다면 서버 인증서의 thumbprint를 지정해 생성
| 증상 | 원인 확인 | 해결 |
|---|---|---|
| Alice/Bob이 OCI Domain에 보이지 않음 | 선택한 사용자 OU/하위 OU와 initial sync 상태 | OU 범위와 filter를 수정하고 sync를 재실행한다. |
| OU 선택 화면에 `CN=Users` 또는 테스트 계정이 보이지 않음 | 화면은 AD object가 아니라 **OU만** 나열한다. 기본 Users는 container다. | 전용 Users/Groups OU를 만들고 test user/group을 이동한 뒤 browser를 새로고침한다. OU 이름만 선택하면 되며 그 화면에서 계정 내용은 표시되지 않는다. |
| 상위 `dds.test` 선택 시 child OU가 자동 선택됨 | Include hierarchy가 선택된 parent OU에 적용됨 | parent selection을 해제하고 Users pane은 `Users`, Groups pane은 `Groups`만 직접 선택한다. |
| `Missing required attribute(s): name` | AD Given Name 또는 Surname이 비어 있어 OCI `name` complex attribute를 만들 수 없음 | AD test user의 Given Name, Surname, Display Name을 채운 뒤 full sync한다. |
| `primaryEmailNotSpecified` | AD `mail` 속성이 비어 있음 | 유효한 Primary Email 형식의 `mail` 값을 설정한다. |
| `invalidEmailFormat` | `.test` 같은 내부 TLD가 OCI email validator에서 거부됨 | PoC라도 RFC 5322 형식으로 OCI가 허용하는 domain의 email을 사용한다. 실제 notification이 필요 없으면 welcome notification을 끈다. |
| 속성을 고쳤는데 `Users synced = 0` | Bridge가 이전 실패 user를 재시도 제외하거나 incremental sync만 수행 | Users/Groups OU 선택을 모두 해제해 Save/OK한 뒤 다시 선택해 Save/OK하여 full sync를 강제하고 Import 결과를 재확인한다. |
| OCI 로그인 비밀번호가 실패 | delegated authentication test에서 동일 AD 계정으로 재현 | AD 비밀번호, Bridge AD 연결, service account delegated-auth 권한을 확인한다. |
| AD 비밀번호를 OCI local password로 입력하려 함 | delegated authentication 활성화 여부 | 성공 시험 후 활성화한다. 활성화 뒤 실제 비밀번호 원천은 AD다. |