Docker+ActiveDirectory+nginx(certbot)에서 Keycloak을 사용하고 싶다!

Windows Server 상에 구축한 ActiveDirectory 자격 증명을 사용하여 OIDC 등을 사용하고 싶었습니다만, 그 때 Keycloak 구축에 상당히 번거롭기 때문에 비망록으로서

나중에 다시 빌드하기 쉽도록 Docker 환경을 사용하고 있습니다.

서버 준비



ConoHa를 사용합니다. (학할이 있는 것이 좋네요)



보통, Docker 환경을 사용할 수 있는 이미지가 있으므로, 그대로 사용합니다(그 자리에서 Docker 환경을 사용할 수 있는 것이 좋네요)

인증서 내보내기



Keycloak는 공식 Docker 이미지 가 제공되고 있습니다.
ActiveDirectory는, 온프레로 구축하고 있어, 이마도키 암호화되어 있지 않다든지 있을 수 없는 시대이므로, 접속은 LDAPS를 사용합니다 그래서 조심합시다)

AD 측은 인증 기관의 기능을 설치하고 CA 인증서를 발급합니다 (이 시점에서 AD도 LDAPS 연결을 사용할 수 있어야합니다)

사실이라면 AD에 사용하는 인증서도 제대로 CA에서 발행하는 것이 바람직하지만 개인 수준이므로 오레올레 인증서에 따라 자체 서명 인증서를 사용합니다.

Keycloak에서 올바르게 SSL 연결할 수 있도록 루트 인증서를 내보내고 신뢰합니다.

툴→인증 기관→발행한 증명서로부터, 가장 요구 ID가 젊고, 증명서 템플릿이 「크로스 증명 기관(CrossCA)」이 되어 있는 것을 더블 클릭




Base64 encoded X.509로 내보내기




Dockerfile 쓰기
(4행째로 ADD하고 있는 파일이 AD를 구축하고 있는 Windows Server로 내보낸 루트 증명서입니다)

Dockerfile
FROM jboss/keycloak

WORKDIR /opt/jboss/keycloak/standalone
ADD cert.pem /usr/share/pki/ca-trust-source/anchors/cert.pem
USER root
RUN keytool -import -noprompt -alias selfsigned -cacerts -file /usr/share/pki/ca-trust-source/anchors/cert.pem  -storepass changeit

JDK가 디폴트로 사용하고 있기 때문에 적합했지만 옵션이없는 것은 keystore에 설치하면 괜찮습니다.
스토어의 패스워드는 changeit 입니다 (바꾸는 편이 좋을까요)

배포
그렇게 말하면, GitLab에 실은 Container Registry의 기능이 있었군요・・・처음 알았습니다...

nginx 설정



Certbot(Let's Encrypt)을 사용하고 싶은 것과 개인적으로 압도적 신뢰가 있으므로 nginx에서 리버스 프록시를 실시해, nginx 밖은 HTTPS, nginx 보다 안쪽은 HTTP인 환경을 준비합니다

이 때, 주의하는 점으로서는, 실제로는 HTTPS에서도, Keycloak로부터 보면 HTTP라고 하는 곳입니다
따라서 리소스가 HTTP로 내장되어 Chrome 등에 화가 나기 때문에 조치 설정도 추가합니다.

proxy.conf
server{
    listen 80;
    server_name YOUR_DOMAIN_NAME;

    location / {
            # プロキシ先のサーバアドレスとポート番号を指定
            return 301 https://$host$request_uri;
    }
}


# HTTPSの設定
server{
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name    YOUR_DOMAIN_NAME;

    # SSL認証キーの参照先。certbotで自動的に生成されるファイルを指定する。
    ssl_certificate     /etc/letsencrypt/live/YOUR_DOMAIN_NAME/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN_NAME/privkey.pem;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    add_header Access-Control-Allow-Origin *;

    location / {
        # プロキシ先のサーバアドレスとポート番号を指定
        proxy_pass http://localhost:8080;
    }
}

좋은 웹페이지 즐겨찾기