0부터 시작하는 Keycloak 공부 - JKS를 이용한 Keycloak 설치 by Helm

Jaehong Lee·2023년 8월 3일
5
post-thumbnail

1. Jks 생성

Keycloak은 JVM 위에서 동작한다. JVM 서버에서 TLS를 사용하려면, Java 키 저장소가 필요하다


필요 개념

JAVA SSL

  • Jave 에서 SSL 인증시 서버가 keystore에 있는 서버 인증서를 보내면, 클라이언트는 truststore에 있는 root 인증서를 사용하여 서버 인증서 검증을 한다
    • truststore : ssl 연결에서 서버가 제공한 인증서를 확인하는 root ca 인증서를 저장하는데 사용
    • keystore : 특정 프로그램 검증을 위해 서버나 클라이언트에 제출해야 하는 개인키 or ID 이증서를 저장하는데 사용

PKCS12

  • PKCS란? 공개키 기반 구조에서 안전하게 데이터를 교환하기 위한 비공식 표준 프로토콜

  • PKCS12란? 바이너리 형식으로 저장되며 하나 혹은 다수의 인증서, 개인키 내용을 파일 하나에 모두 담고 있는 KeyStore 파일이며, 비밀번호로 암호화되어 있다

    • 하나의 파일에 여러 암호화 관련 요소들을 합쳐서 보관하는 방식에 관한 표준이다

JKS & Secret 생성

순서

  1. root ca 파일을 가지고 trust store 생성
  2. tls 인증서를 가지고 pkcs12 파일 생성
  3. pkcs12 파일을 이용해 keystore 생성
  4. keystore 타입을 pkcs12 로 변경
  5. keystore 와 trust store를 이용하여 K8S Secret 생성

JKS 생성

OpenSSL을 이용하여 Root 인증서, 서버 인증서, 개인키를 준비하자

keytool -importcert -alias ca-cert -file rootCA.pem -keystore keycloaks.truststore.jks
  • trust store 생성하자. 암호화에 사용한 Password를 잘 기억하자
openssl pkcs12 -export -in 서버인증서 -inkey 개인키 -out keycloaks.test.net.p12
  • 서버 인증서와 개인키를 이용해 pkcs12 파일을 생성하자
  • Keytool은 외부에서 생성된 개인키를 Keystore에 등록하는 방법을 제공하지 않는다. 허나, JDK 6 이상부터는 서버 인증서와 개인키를 pkcs12 파일로 만들어서 Keystore에 등록할 수 있다
keytool -list -v -storetype pkcs12 -keystore keycloaks.test.net.p12
  • PKCS12 파일 내부의 alias 리스트가 출력하여 keystore에 import 할 alias를 확인하자
  • 해당 alias는 keystore 생성 시, import 명령어의 -alias 옵션에 지정한다
keytool -importkeystore -deststorepass '암호화에 사용한 비밀번호' -destkeypass '암호화에 사용한 비밀번호' -destkeystore keycloaks.test.jks -srckeystore keycloaks.test.net.p12 -srcstoretype PKCS12 -alias 1
  • keystore를 생성하자
keytool -importkeystore -srckeystore keycloaks.keystore.jks -destkeystore keycloaks.keystore.jks -deststoretype pkcs12
  • keystore 형식을 pkcs12으로 변경
  • JAVA에서만 사용하면 JKS 형식으로 사용하지만, 여러 플랫폼에서 사용해야 하면, JKS를 PKCS12로 변환해야 한다

Kubernetes Secret 생성

kubectl create secret generic truststore --from-file=keycloaks.truststore.jks --from-file=keycloaks.keystore.jks -n keycloak --kubeconfig /home/ec2-user/.kube/config
  • 생성한 KeyStore와 Trust Store를 이용해 Secret을 생성하자
  • 해당 Secret을 이용해 KeyCloak에 KeyStore와 Trust Store를 등록할 것이다

2. Keycloak 설치

Helm Chart 준비

helm fetch bitnami/keycloak
  • Helm Chart를 가져오자
tar -xvzf keycloak-16.0.2.tgz
  • 압축 & 묶음을 해제하자

Values.yaml 수정

Admin 계정 정보 설정

auth:
  ## @param auth.adminUser Keycloak administrator user
  ##
  adminUser: user
  ## @param auth.adminPassword Keycloak administrator password for the new user
  ##
  adminPassword: user123
  • Keycloak Admin 계정 정보 설정

Ingress 설정

ingress:
  enabled: true
  ingressClassName: nginx
  pathType: ImplementationSpecific
  apiVersion: ""
  hostname: keycloak.test.net
  path: /
  servicePort: http
  annotations:
       ingress.annotations.nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
  labels: {}
  tls: true
  selfSigned: false
  extraHosts: []
  extraPaths: []
  extraTls: []
  secrets:
    name: keycloak.test.net-tls
      key: |
        개인키 내용
      certificate: |
        서버키 내용  
  • Ingress 설정이다. Domain 주소를 설정하고, TLS 인증서를 적용하자

Postgresql 설정

  • 외부 DB를 사용하는 방법도 있지만, 이번에는 PostgreSql 파드를 띄워서 사용하겠다
postgresql:
  enabled: true
  auth:
    postgresPassword: test123
    username: bn_keycloak
    password: test123
    database: bitnami_keycloak
    existingSecret: ""
  architecture: standalone
  • postgresql enabled를 true로 하여 PostgreSql을 생성하도록 하자. 사용하는 차트는 Chart.yaml의 dependencies에 설정되어 있다

Password를 정적으로 설정하는 이유는 아래 링크를 참조하자

https://velog.io/@lijahong/0%EB%B6%80%ED%84%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8A%94-Keycloak-%EA%B3%B5%EB%B6%80-FATAL-password-authentication-failed-for-user-bnkeycloak


TLS 설정

  • 위에서 생성한 Secret을 이용하여 Keycloak에 Keystore와 Trust Store를 등록하는 설정이다. 이는 Keycloak Web 사이트에 서버 인증서를 등록하는 것이 아닌, Keycloak Container에 서버 인증서, 개인키, 루트 인증서를 등록하는 것이다
    • Keycloak Web 사이트에 서버 인증서를 등록하는 것은 위에 Ingress 설정이다
tls:
  enabled: true
  autoGenerated: false
  existingSecret: "생성한 Secret 이름"
  usePem: false
  #truststoreFilename: ""
  truststoreFilename: "keycloaks.truststore.jks"
  #keystoreFilename: ""
  keystoreFilename: "keycloaks.keystore.jks"
  keystorePassword: "암호화에 사용한 비밀번호"
  truststorePassword: "암호화에 사용한 비밀번호"
  passwordsSecret: ""
  • 위와 같이 설정하자

배포 및 확인

배포

helm install keycloak -n keycloak .
  • Helm을 이용하여 keycloak namespace에 Keycloak을 배포하자

확인

  • Keycloak에 잘 접속된다

  • Admin Console에 접속하자

  • Admin Console에 잘 접속된다

  • Keycloak Web 사이트에 TLS 인증서가 잘 적용되었다
profile
멋진 엔지니어가 될 때까지

2개의 댓글

comment-user-thumbnail
2023년 10월 22일

잘보고갑니다

답글 달기
comment-user-thumbnail
2024년 4월 9일

안녕하세요! 좋은글 잘 보고갑니다~
궁금한게 있는데 rootCA.pem 같은경우는 어떻게 생성하셨는지 알 수 있을까요?
생성해서 했는데 제대로 진행이 안되고 있어서요 ㅠㅠ!

답글 달기