Files

69 lines
8.2 KiB
Markdown

# 트러블슈팅: OCI AD Bridge · OAuth · DDS MCP
[개요로 돌아가기](README.md) · [적용 Cookbook](cookbook.md) · [아키텍처](architecture.md)
## Windows AD Bridge
| 증상 | 원인 확인 | 해결 |
|---|---|---|
| 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 보관/삭제 정책을 적용해 자동화한다. |
| 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 원격 관리 경로가 막힌 경우
이 PoC VM에서는 OCI NSG의 TCP 5986 누락을 보완했어도 Windows가 HTTPS WinRM 요청에 응답하지 않았다. 따라서 **NSG rule 추가만으로 WinRM이 활성화되는 것은 아니다.**
RDP로 `DDS\\opc`로 로그인한 뒤 Administrator PowerShell에서 다음 순서로 점검한다. 운영에서는 management source를 반드시 고정 IP 또는 private subnet으로 제한한다.
```powershell
winrm quickconfig
winrm enumerate winrm/config/listener
Get-NetFirewallRule -DisplayGroup 'Windows Remote Management' |
Select-Object DisplayName, Enabled, Direction, Action
```
HTTPS listener가 없다면 서버 인증서의 thumbprint를 지정해 생성하고, TCP 5986 firewall rule을 enable한 뒤 외부에서 `/wsman` endpoint를 재확인한다. OCI Run Command가 `ACCEPTED`/`VISIBLE`에 머물면 그 기능으로 installer를 실행하지 말고, Windows Oracle Cloud Agent와 outbound OCI 연결을 RDP에서 복구한 후 다시 시도한다.
## 동기화와 delegated authentication
| 증상 | 원인 확인 | 해결 |
|---|---|---|
| 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다. |
| `Security → Delegated authentication` 메뉴가 보이지 않음 | Identity Domain의 delegated authentication capability가 테넌트에서 활성화되지 않았을 수 있다. | OCI Console UI를 찾는 문제로 가정하지 말고 domain capability/서비스 등급을 확인한다. OCI tenancy administrator 또는 Oracle Support에 delegated authentication enablement를 요청한다. |
| Identity Source PATCH가 `Delegated Authentication is not yet enabled. This feature is currently in beta phase.`로 400 반환 | 해당 Identity Domain에서 delegated authentication feature가 enable되지 않았다. Bridge 설치·동기화·LDAPS 상태와는 별개인 OCI control-plane 제한이다. | 기능 enablement 전에는 OCI OAuth 로그인에 AD 비밀번호를 사용할 수 없다. Keycloak 경로를 유지하거나 OCI local/federated 인증을 임시로 사용하고, enablement 완료 후 delegated auth test/activate를 재개한다. |
## OCI OAuth와 AIPF
| 증상/오류 | 원인 | 해결 |
|---|---|---|
| `/admin/v1/admin/v1/Apps` 및 401 | `oci identity-domains --endpoint``/admin/v1`까지 넣음 | CLI에는 Domain base URL만 사용한다. raw request target에만 `/admin/v1`을 넣는다. |
| `No such option: --header` | `oci raw-request` 옵션명 오류 | `--request-headers '{"Content-Type":"application/json"}'`를 사용한다. |
| `Missing required attribute(s): basedOnTemplate` | confidential client app template 누락 | `basedOnTemplate.value=CustomWebAppTemplateId`를 지정한다. |
| authorize URL이 302 대신 200 | OCI Domain이 sign-in HTML과 session cookie를 반환 | 정상이다. browser에서 OCI login UI가 표시되는지 확인한다. |
| AIPF callback 오류 | redirect URI가 두 AIPF 경로 중 실제 요청 경로와 다름 | `/agentFactory/.../callback``/v1/.../callback` 둘 다 등록한다. |
| 이전 사용자로 자동 로그인 | OCI Domain browser SSO session 유지 | OCI logout 후 새 MCP source를 연결한다. |
## MCP와 DDS
| 증상 | 원인 | 해결 |
|---|---|---|
| MCP `401` / tools discovery 실패 | OCI issuer/audience가 runtime에 반영되지 않았거나 token 만료 | discovery/JWT claim을 기준으로 issuer·audience를 설정한다. |
| token 검증은 되지만 `AUTHORIZATION_DENIED` | OCI `iss + sub` binding 미등록/비활성 | `CB_EXTERNAL_IDENTITY_BINDING`과 DDS END USER mapping을 함께 확인한다. |
| `DDS_CONTEXT_UNAVAILABLE` | DB service client/scope/domain URL 설정 문제 | `DDS_MCP_SERVICE_TEST`, `DDS_ORACLE_DB_TEST`, `DB_ACCESS_SCOPE`, DB application identity를 확인한다. |
| `ORA-52602` | database-access token issuer/resource/scope 불일치 | DB의 OCI Domain URL 정규형(`:443` 포함), resource app ID/scope를 맞춘다. |
| Alice 성공, Bob “DDS 보호 객체” | Bob DATA GRANT 없음 | 의도된 default deny다. 정책상 필요할 때만 최소 grant를 추가한다. |
외부 오류 메시지에는 SQL, table명, secret을 노출하지 않는다. 내부 감사에는 correlation ID, 내부 user ID, 선택 DDS END USER, allow/deny 결과를 남긴다.