# OCP-IdP 추가

TASK DESCRIPTION

계정제공자(IdP-Identity Provider)를 추가합니다
본 매뉴얼에서는 htpasswd와 keycloak을 설명합니다.

# htpasswd 추가

htpasswd는 OCP자체적으로 계정을 추가할 수 있는 방법입니다.

  • 계정 등록 파일 생성
$ yum install -y httpd-tools  
$ which htpasswd  
$ htpasswd -c -B -b <파일명> <user_name> <password>  
계정 추가시에는 -c옵션 주면 안됨   
예) 
[root@bastion idp]# htpasswd -c -B -b users.htpasswd hklee passw0rd \
Adding password for user hklee \
[root@bastion idp]# htpasswd -B -b users.htpasswd sihan passw0rd \
Adding password for user sihan \
[root@bastion idp]# htpasswd -B -b users.htpasswd shlee passw0rd \
Adding password for user shlee \
[root@bastion idp]# cat users.htpasswd \
hklee:$2y$05$1ZSl07frbmRvwY2Uxuz.Cu38bTh.UMR8wAD1/i5YTOuym0yhX8F4S \
sihan:$2y$05$VF9BcY4pSPTy7uParHwZt.Qaf5agVto5EduZXmuPGwFxOyqdNRPqu \
shlee:$2y$05$Lx9qrVCFnC1weCMkOkj/jOA6kOkM49CjhnQrOOVFHmyrwhHz0b2Ta \
  • IdP추가

    • OCP webconsole로그인: 최초에는 kubeadmin으로 로그인
    • Administration->Cluster-Settings클릭
    • Global configuration탭 클릭하고 oAuth 클릭
    • IdP추가: htpasswd 선택하고 위에서 생성한 파일 지정
  • rolebinding
    추가한 user에게 권한을 binding 합니다.

    • OCP web console > user management > Role bindings
    • create role binding

# ldap 추가

먼저 아래 링크 참조하여 LDAP서버 설치 및 구성합니다.
LDAP서버 설치 및 구성

그리고 OCP Web console에서 IdP를 LDAP 타입으로 추가합니다.

  • Administration->Cluster-Settings클릭
  • Global configuration탭 클릭하고 oAuth 클릭
  • IdP추가: LDAP 선택

아래 화면을 참조하여 값을 지정합니다. 특히 url, attributes > id을 정확하게 지정하십시오.
url이 맞는지 확인하려면 'curl [url]'명령을 이용하십시오.

등록 후 YAML에서 'insecure'를 'true'로 변경하십시오.

apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  annotations:
    release.openshift.io/create-only: 'true'
  creationTimestamp: '2020-07-02T04:17:40Z'
  generation: 26
  name: cluster
  resourceVersion: '129232'
  selfLink: /apis/config.openshift.io/v1/oauths/cluster
  uid: 2c5c1e08-a2b8-4684-9282-83fb5f9fa528
spec:
  identityProviders:
    - htpasswd:
        fileData:
          name: htpasswd-cw55j
      mappingMethod: claim
      name: ADMINS
      type: HTPasswd
    - ldap:
        attributes:
          email: []
          id:
            - uid
          name:
            - cn
          preferredUsername:
            - uid
        bindDN: 'cn=admin,dc=ldap,dc=kubepia,dc=com'
        bindPassword:
          name: ldap-bind-password-b5j5j
        insecure: true
        url: 'ldap://ldap.kubepia.com:389/ou=users,dc=ldap,dc=kubepia,dc=com?uid'
      mappingMethod: claim
      name: ldap
      type: LDAP

저장 후 namespace 'openshift-authentication'의 Pod 2개가 재생성될때까지 기다립니다.

[root@ocp-infra1 ~]# oc get po -n openshift-authentication
NAME                               READY   STATUS    RESTARTS   AGE
oauth-openshift-5cff94bdcd-5kqcx   1/1     Running   0          14h
oauth-openshift-5cff94bdcd-gcvlr   1/1     Running   0          14h

user에 권한 부여를 위해 role binding을 합니다.

  • OCP web console > user management > Role bindings
  • create role binding
    아래는 cluster-admin 권한을 부여하는 role binding 예제입니다.

로그아웃 후 LDAP으로 로그인하는 버튼이 나올때까지 기다립니다.
추가한 user로 로그인 테스트합니다.

# keycloak 추가

# keycloak 설치

  • 작업디렉토리 생성
    cluster접근할 수 있는 Terminal에서 작업(예: bastion VM에서 작업)
$ mkdir -p ~/tmp/keycloak
$ cd ~/tmp/keycloak 
  • namespace 생성
$ oc new-project keycloak
$ oc adm policy add-scc-to-user anyuid -z default 
$ oc project keycloak
  • helm repository 추가
$ helm repo add codecentric https://codecentric.github.io/helm-charts
$ helm search repo keycloak
[root@bastion ~]# helm search repo keycloak
NAME                	CHART VERSION	APP VERSION	DESCRIPTION
codecentric/keycloak	8.2.2        	10.0.0     	Open Source Identity and Access Management For ...
stable/keycloak     	4.10.1       	5.0.0      	DEPRECATED - Open Source Identity and Access Ma
  • helm으로 keycloak설치
$ helm inspect values codecentric/keycloak > config.yaml
$ vi config.yaml
...
  ## Username for the initial Keycloak admin user
  username: keycloak

  ## Password for the initial Keycloak admin user. Applicable only if existingSecret is not set.
  ## If not set, a random 10 characters password will be used
  password: "passw0rd"
...
  ## OpenShift route configuration.
  ## ref: https://docs.openshift.com/container-platform/3.11/architecture/networking/routes.html
  route:
    enabled: true
    path: /
...
  ## Persistence configuration
  persistence:
    # If true, the Postgres chart is deployed
    deployPostgres: true

    # The database vendor. Can be either "postgres", "mysql", "mariadb", or "h2"
    dbVendor: postgres
...
postgresql:
  ### PostgreSQL User to create.
  ##
  postgresqlUsername: keycloak

  ## PostgreSQL Password for the new user.
  ## If not set, a random 10 characters password will be used.
  ##
  postgresqlPassword: "passw0rd"
  ...
  ## Persistent Volume Storage configuration.
  ## ref: https://kubernetes.io/docs/user-guide/persistent-volumes
  ##
  persistence:
    ## Enable PostgreSQL persistence using Persistent Volume Claims.
    ##
    enabled: true

$ helm install keycloak -f config.yaml codecentric/keycloak -n keycloak
$ watch oc get po
Every 2.0s: oc get po                                                                                                                                Sun May 31 14:17:18 2020

NAME                    READY   STATUS              RESTARTS   AGE
keycloak-0              0/1     Init:0/1            0          12s
keycloak-postgresql-0   0/1     ContainerCreating   0          12s

  • keycloak 로그인
$ oc get route 

웹브라우저에서 위 주소로 접근합니다.
config.yaml에서 지정한 id와 pw로 로그인합니다.

# key cloak 설정: realm, client 작성

  • realm 작성
    realm은 인증대상범위를 의미합니다.

issuer주소를 clipboard에 복사해 놓습니다.

예) https://keycloak-keycloak.apps.cp.kubepia.com/auth/realms/kubepia

public key값을 Local PC에 파일로 생성합니다.

public key Sample

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnXVty1Q9jiObqJYPPAGLMiPhm8a+nVncMWoL9KVO4pZPkA6PQsYcMzq+YQyHQy442p+l8d2si5ZcNgLnnfH7WtiysMxRVUHKeNtGAetSwZIb2r/WLapiEoBoXSBZ4hREWaYfZqJAzrxgpRGsl8J5MmYj0HLoXQdY6H3CuPN+770EAA411Xvr31Z9MloC4/XKO+ZxqXUk5N8cCSWvPt1hyWpG32/fqgglcKUCdbJ1P4ieYT9y8NkBzHG9+CfGJUr7Sh7goSTKiO0gAoP/b32lmTGWnmV91JcYOmGQXbkBBA8kfB0l6C+TG574sIwmChemhNeMjU6SKCvM56RqvNR7rQIDAQAB
  • Client 작성

Client는 keycloak으로 인증을 요청하는 소스 어플리케이션입니다.

Credential값을 clipboard에 복사합니다.

# OCP의 IdP로 keycloak 등록

등록방법 찾는중입니다.

# User IdP 변경

User의 IdP가 변경(예: htpasswd -> LDAP)된 경우 처리에 대해 설명합니다.
IdP가 변경된 경우 User를 삭제하고, 로그인 하려고 하면 'Cannot crete user'라는 에러가 발생합니다.
아래와 같이 기존 User의 identities정보와 리소스를 삭제하고, 다시 로그인하면 됩니다.

  • User identities정보 삭제
$ oc get User
$ oc edit User hklee
As-Is To-Be
  • identities 리소스 삭제
$ oc get identities
$ oc delete identities admin:hklee
  • 재 로그인
    새로운 IdP로 다시 로그인하고 User정보를 보면 새로운 Identity정보로 변경된것을 확인할 수 있습니다.
$ oc get User
$ oc get identities