본문 바로가기
서버구축 (WEB,DB)

Kubernetes 클러스터 환경 Kubeview 배포와 인증 보안 적용

by 날으는물고기 2024. 12. 13.

Kubernetes 클러스터 환경 Kubeview 배포와 인증 보안 적용

Kubeview를 Kubernetes 클러스터에 배포한 후 인증 없이 접근할 수 있는 문제를 해결하기 위해서는, Kubeview에 인증 및 권한 관리를 적용해야 합니다. 일반적으로 Kubernetes에 서비스로 배포된 애플리케이션에 인증을 적용하려면, 다음 두 가지 방법을 사용할 수 있습니다.

  1. Ingress에 기본 인증 적용 방법
    Kubeview에 접근하기 위해 Ingress를 설정하고 Ingress에서 인증을 처리하는 방법입니다. Ingress는 HTTP/HTTPS 라우팅을 제공하며, 외부에서 오는 트래픽을 클러스터 내부의 서비스로 전달합니다. 이와 함께 기본 인증이나 OAuth 2.0, OIDC(OpenID Connect) 같은 인증 방법을 추가할 수 있습니다.기본 인증을 추가하기 위해서는, Kubernetes의 Ingresshtpasswd를 이용해 사용자 인증을 구성할 수 있습니다.
    1. htpasswd 파일 생성
      인증을 위한 사용자 이름과 비밀번호를 생성합니다.
      sudo apt-get install apache2-utils  # 필요한 경우 설치
      htpasswd -c auth myuser  # 'myuser'는 사용자 이름입니다.
      이 명령은 사용자 이름과 비밀번호가 포함된 auth라는 파일을 생성합니다.
    2. Secret 생성
      생성된 auth 파일을 Kubernetes Secret으로 등록합니다.
      kubectl create secret generic basic-auth --from-file=auth
    3. Ingress 설정
      Kubeview에 대한 Ingress 설정을 작성합니다. 아래는 기본 인증을 적용한 Ingress의 예입니다.이 설정에서는 NGINX Ingress Controller를 사용하여 기본 인증을 적용하는 방법을 보여줍니다. kubeview.example.com 도메인으로 접근 시, 사용자 이름과 비밀번호를 요구하게 됩니다.
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: kubeview-ingress
        annotations:
          nginx.ingress.kubernetes.io/auth-type: "basic"
          nginx.ingress.kubernetes.io/auth-secret: "basic-auth"
          nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
      spec:
        rules:
        - host: kubeview.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: kubeview
                  port:
                    number: 80
  2. OAuth 2.0 또는 OIDC 기반 인증 적용
    보다 강력한 인증 방법을 원할 경우, OAuth 2.0 또는 OIDC를 사용하여 인증을 처리할 수 있습니다. 이 경우 Keycloak, Dex 등의 인증 프로바이더와 Ingress Controller를 연동하여 세부적인 인증 관리를 수행할 수 있습니다.
    예를 들어, oauth2-proxy를 사용하여 OAuth 인증을 적용할 수 있습니다. 아래는 OAuth 2.0 인증을 적용하는 기본적인 절차입니다.
    1. oauth2-proxy 설치
      Helm 차트를 이용해 설치할 수 있습니다.
      helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests
      helm install oauth2-proxy/oauth2-proxy --name kubeview-oauth2-proxy
      oauth2-proxy는 외부 OAuth 2.0 공급자를 통해 인증을 처리해 주는 프록시입니다.
    2. Ingress에 OAuth 2.0 적용
      oauth2-proxy와 연동된 Ingress 설정을 추가합니다.이 방식은 GitHub, Google, Keycloak 등의 OAuth 2.0 제공자와 연동하여 안전하게 Kubeview에 인증을 적용할 수 있습니다.
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: kubeview-ingress
        annotations:
          nginx.ingress.kubernetes.io/auth-url: "https://<oauth2-proxy-url>/oauth2/auth"
          nginx.ingress.kubernetes.io/auth-signin: "https://<oauth2-proxy-url>/oauth2/start?rd=$request_uri"
      spec:
        rules:
        - host: kubeview.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: kubeview
                  port:
                    number: 80

OpenLDAP을 이용하여 Kubeview와 같은 서비스에 인증을 적용하는 방법은, OpenLDAP을 기반으로 LDAP 인증을 설정하고 이를 Kubernetes Ingress Controller 또는 oauth2-proxy와 같은 프록시 서비스와 연동하여 LDAP 인증을 처리하는 방식으로 구현할 수 있습니다. 아래는 OpenLDAP을 활용한 인증 절차입니다.

방법 1: NGINX Ingress와 OpenLDAP 연동

  1. NGINX Ingress Controller 설치 및 설정
    이미 설치된 NGINX Ingress Controller가 있는 경우, OpenLDAP을 연동하여 인증을 처리할 수 있습니다. OpenLDAP 인증을 위한 nginx-auth-ldap 모듈을 사용하는 방법입니다.
  2. LDAP 설정 적용
    NGINX에서 LDAP 인증을 설정하려면 nginx-auth-ldap 모듈을 사용하는 방식으로 nginx.conf에 LDAP 설정을 추가해야 합니다. NGINX Ingress Controller의 ConfigMap을 수정하거나 별도의 NGINX를 배포하여 처리할 수 있습니다.
    ldap_server openldap_auth {
        url ldap://<ldap-server-address>:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=person);
        binddn "cn=admin,dc=example,dc=com";
        binddn_passwd <admin-password>;
        group_attribute memberUid;
        group_attribute_is_dn on;
        require valid_user;
    }
    ldap.conf 파일에 OpenLDAP 서버 설정을 추가합니다.
    • ldap-server-address: OpenLDAP 서버의 주소
    • binddn: 인증을 위해 사용할 LDAP 바인딩 계정
    • binddn_passwd: 바인딩 계정의 비밀번호
  3. Ingress에서 LDAP 인증 적용
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: kubeview-ingress
      annotations:
        nginx.ingress.kubernetes.io/auth-url: "ldap://<ldap-server-address>/ou=users,dc=example,dc=com?uid"
        nginx.ingress.kubernetes.io/auth-realm: "LDAP Authentication"
    spec:
      rules:
      - host: kubeview.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kubeview
                port:
                  number: 80
    이 설정은 Kubeview로 접근할 때 OpenLDAP 인증을 요구합니다.
  4. LDAP 인증을 NGINX Ingress에 적용하려면 다음과 같이 Ingress 리소스에 LDAP 설정을 추가합니다.

방법 2: oauth2-proxy와 LDAP 연동

oauth2-proxy를 통해 LDAP 인증을 처리하는 방법도 있습니다. oauth2-proxy는 OAuth 2.0 및 OIDC뿐만 아니라 LDAP 인증도 지원합니다.

  1. oauth2-proxy 설정 파일 구성
    oauth2-proxy 설정 파일에 OpenLDAP 정보를 입력하여 설정을 구성합니다.
    예를 들어, oauth2-proxy.cfg 파일을 작성할 때 다음과 같은 LDAP 설정을 추가합니다.
    provider = "ldap"
    ldap_url = "ldap://<ldap-server-address>:389"
    ldap_bind_dn = "cn=admin,dc=example,dc=com"
    ldap_bind_password = "<admin-password>"
    ldap_user_search_base_dn = "ou=users,dc=example,dc=com"
    ldap_user_search_filter = "(uid=%s)"
    email_domains = ["example.com"]
    cookie_secret = "<randomly-generated-secret>"
    • ldap_url: LDAP 서버 주소
    • ldap_bind_dn: 바인딩 계정
    • ldap_bind_password: 바인딩 계정의 비밀번호
    • ldap_user_search_base_dn: 검색할 사용자 경로
  2. oauth2-proxy 배포
    설정 파일이 완료되면, Helm을 이용해 oauth2-proxy를 배포할 수 있습니다.
    helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests
    helm install kubeview-oauth2-proxy oauth2-proxy/oauth2-proxy -f oauth2-proxy.cfg
  3. Ingress 설정
    oauth2-proxy를 통한 LDAP 인증이 가능해졌으므로, Ingress 설정에서 이를 적용할 수 있습니다.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: kubeview-ingress
      annotations:
        nginx.ingress.kubernetes.io/auth-url: "https://<oauth2-proxy-url>/oauth2/auth"
        nginx.ingress.kubernetes.io/auth-signin: "https://<oauth2-proxy-url>/oauth2/start?rd=$request_uri"
    spec:
      rules:
      - host: kubeview.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kubeview
                port:
                  number: 80
    이 방식은 사용자가 Kubeview에 접근할 때 OpenLDAP을 통해 인증을 수행하며, 인증이 성공하면 접근을 허용합니다.

방법 3: RBAC과 연동하여 사용자 관리

LDAP 인증을 통해 로그인한 사용자를 Kubernetes의 RBAC(Role-Based Access Control)와 연동하여 세부 권한 관리를 할 수 있습니다. 이를 통해 특정 LDAP 그룹에 속한 사용자만 Kubeview에 접근할 수 있도록 설정할 수 있습니다.

  1. Kubernetes RBAC 설정
    ClusterRoleClusterRoleBinding을 통해 LDAP 그룹과 Kubernetes 리소스를 연동합니다.
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: kubeview-user
    rules:
    - apiGroups: [""]
      resources: ["pods", "services", "namespaces"]
      verbs: ["get", "list"]
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: kubeview-access
    subjects:
    - kind: Group
      name: "<ldap-group-name>"  # OpenLDAP에서 정의된 그룹 이름
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: kubeview-user
      apiGroup: rbac.authorization.k8s.io

위 방법 중 하나를 선택하여 OpenLDAP 인증을 Kubernetes 클러스터 내의 Kubeview에 적용할 수 있습니다. 외부에 노출된 NGINX 앞단에 OpenLDAP 인증을 적용하려면, NGINX의 ngx_http_auth_ldap_module을 사용하여 LDAP 인증을 구성할 수 있습니다.

1. nginx-auth-ldap 모듈 설치

ngx_http_auth_ldap_module을 이용하여 NGINX에서 LDAP 인증을 처리할 수 있습니다. 이 모듈이 기본적으로 NGINX에 포함되지 않기 때문에, NGINX를 컴파일하여 LDAP 모듈을 추가하거나, 미리 컴파일된 패키지를 사용하는 방법이 있습니다. 만약 이미 NGINX를 사용 중이라면 LDAP 모듈이 포함된 버전을 설치하는 것이 가장 간단합니다.

 

다음은 LDAP 모듈을 포함한 NGINX 설치 방법입니다. 만약 모듈을 직접 컴파일하거나 추가하지 않는다면, LDAP 모듈이 포함된 패키지 저장소를 이용해 설치하는 것을 권장합니다.

sudo apt-get install libldap2-dev
sudo apt-get install nginx-module-ldap

2. LDAP 모듈을 활성화

nginx.conf 또는 NGINX 설정 파일에 LDAP 관련 설정을 추가해야 합니다. LDAP 서버와의 연결 및 인증 정보를 설정합니다.

http {
    ldap_server openldap_auth {
        url ldap://<ldap-server-ip>:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=person);
        binddn "cn=admin,dc=example,dc=com";
        binddn_passwd "<admin-password>";
        group_attribute memberUid;
        group_attribute_is_dn on;
        require valid_user;
    }

    server {
        listen 80;
        server_name <your-server-domain>;

        location / {
            auth_ldap "LDAP Authentication";
            auth_ldap_servers openldap_auth;
            proxy_pass http://<backend-k8s-service>;
        }
    }
}

위 설정에서 중요한 부분은 다음과 같습니다.

  • ldap://<ldap-server-ip>: OpenLDAP 서버의 IP 주소입니다.
  • ou=users,dc=example,dc=com: LDAP에서 인증할 사용자가 있는 경로입니다.
  • binddn "cn=admin,dc=example,dc=com": LDAP 서버에 바인딩할 관리자 계정입니다.
  • binddn_passwd "<admin-password>": 해당 관리자의 비밀번호입니다.
  • require valid_user: 인증에 성공한 사용자만 접근을 허용하는 옵션입니다.

3. NGINX 설정 테스트 및 적용

LDAP 설정을 추가한 후, NGINX 설정 파일이 올바른지 테스트합니다.

sudo nginx -t

문제가 없다면 NGINX를 다시 로드하여 새로운 설정을 적용합니다.

sudo systemctl reload nginx

4. NGINX와 Kubernetes 연동

이제 NGINX를 통해 LDAP 인증이 성공한 경우에만 Kubernetes 클러스터의 Kubeview와 같은 서비스로 접근할 수 있습니다. proxy_pass 지시문을 이용해 Kubernetes 클러스터 내 서비스로 트래픽을 전달하는 것을 확인하세요. 예를 들어, Kubeview 서비스가 kubeview-service라는 이름으로 default 네임스페이스에 존재한다고 가정하면 proxy_pass URL을 다음과 같이 설정할 수 있습니다.

proxy_pass http://kubeview-service.default.svc.cluster.local:8080;

5. LDAP 그룹 기반 인증 설정

LDAP 그룹을 기반으로 특정 그룹에 속한 사용자만 접근을 허용하려면, require group 지시문을 사용할 수 있습니다. 예를 들어, 특정 그룹에 속한 사용자만 접근하도록 제한하려면 다음과 같이 설정합니다.

ldap_server openldap_auth {
    url ldap://<ldap-server-ip>:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=person);
    binddn "cn=admin,dc=example,dc=com";
    binddn_passwd "<admin-password>";
    group_attribute memberUid;
    group_attribute_is_dn on;
    require group "cn=k8s-admins,ou=groups,dc=example,dc=com";
}

이 설정은 k8s-admins 그룹에 속한 사용자만 인증을 통과할 수 있도록 제한합니다.

6. SSL/TLS 설정

LDAP 연결 시 보안을 강화하려면 SSL/TLS를 적용하여 통신을 암호화할 수 있습니다. 이를 위해 ldap:// 대신 ldaps://를 사용하고, LDAP 서버에서 SSL 인증서를 설정해야 합니다.

ldap_server openldap_auth {
    url ldaps://<ldap-server-ip>:636/ou=users,dc=example,dc=com?uid?sub?(objectClass=person);
    binddn "cn=admin,dc=example,dc=com";
    binddn_passwd "<admin-password>";
    group_attribute memberUid;
    group_attribute_is_dn on;
    require valid_user;
}

이 설정을 적용하면, 외부에서 NGINX를 통해 Kubeview와 같은 Kubernetes 서비스에 접근할 때 OpenLDAP을 이용한 인증이 요구됩니다.

 

사설 IP에서 접근하는 경우 인증을 제외하고, 사설 IP가 아닌 경우에만 LDAP 인증을 적용하려면 NGINX 설정에서 조건에 따라 인증을 적용하는 방식으로 설정할 수 있습니다. 이를 위해 NGINX의 satisfy 지시문과 allow/deny 지시문을 사용할 수 있습니다. 다음은 NGINX 설정에서 사설 IP 대역을 허용하고, 외부 IP만 LDAP 인증을 요구하는 방법입니다.

1. NGINX 설정 파일 수정

아래와 같이 nginx.conf 또는 사이트별 NGINX 설정 파일을 수정합니다. 여기서는 사설 IP 주소 범위를 allow하고, 그 외의 IP에 대해 LDAP 인증을 적용하는 설정입니다.

http {
    ldap_server openldap_auth {
        url ldap://<ldap-server-ip>:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=person);
        binddn "cn=admin,dc=example,dc=com";
        binddn_passwd "<admin-password>";
        group_attribute memberUid;
        group_attribute_is_dn on;
        require valid_user;
    }

    server {
        listen 80;
        server_name <your-server-domain>;

        location / {
            # 사설 IP 대역 허용
            allow 10.0.0.0/8;
            allow 172.16.0.0/12;
            allow 192.168.0.0/16;

            # 모든 외부 IP는 인증을 요구
            deny all;

            # LDAP 인증 설정
            satisfy any;  # allow 조건이 충족되면 인증 없이 통과
            auth_ldap "LDAP Authentication";
            auth_ldap_servers openldap_auth;

            # 프록시 설정
            proxy_pass http://<backend-k8s-service>;
        }
    }
}

2. 설정 항목 설명

  • allow: 사설 IP 대역을 지정하여 해당 범위에서 들어오는 요청은 인증 없이 접근을 허용합니다. 여기서 사용한 사설 IP 대역은 다음과 같습니다.
    • .10.0.0.0/8: 10.x.x.x 대역
    • 172.16.0.0/12: 172.16.x.x - 172.31.x.x 대역
    • 192.168.0.0/16: 192.168.x.x 대역
  • deny all: 위의 allow에서 허용된 IP 대역 외에는 모두 접근을 차단합니다.
  • satisfy any: allow 조건이나 인증 중 하나라도 만족하면 요청을 허용합니다. 즉, 사설 IP에서 온 요청은 allow로 통과되고, 외부 IP에서 온 요청은 LDAP 인증을 요구합니다.
  • auth_ldap: 사설 IP가 아닌 경우 LDAP 인증을 요구합니다.

3. NGINX 설정 적용

설정 파일을 수정한 후, NGINX 설정이 올바른지 테스트합니다.

sudo nginx -t

문제가 없다면 NGINX를 다시 로드하여 새로운 설정을 적용합니다.

sudo systemctl reload nginx

4. 외부 IP만 인증되는지 테스트

  • 사설 IP 대역(예: 10.0.0.x, 192.168.x.x)에서 접근할 경우 인증이 요구되지 않고 Kubeview에 접근이 가능한지 확인합니다.
  • 외부 IP에서 접근할 경우 LDAP 인증이 적용되는지 확인합니다.

 

이 설정을 통해 사설 IP에서의 접근은 인증 없이 허용하고, 외부에서의 접근은 LDAP 인증을 적용할 수 있습니다. 위 설정에서 allow, deny, 그리고 satisfy any를 사용하여 사설 IP에서 접근할 때 인증 없이 허용하고, 외부 IP에서만 LDAP 인증을 요구하려는 경우, 몇 가지 점검할 부분과 개선이 필요할 수 있습니다.

1. satisfy any 동작 방식

NGINXsatisfy 지시어는 allowdenyauth_ldap 지시어를 결합하여 접근 제어를 처리합니다. 이때 satisfy any는 다음 조건 중 하나라도 만족하면 접근을 허용하는 방식입니다.

  • IP가 allow된 대역에 있으면 인증 없이 접근을 허용.
  • IP가 deny된 대역에 있으면 LDAP 인증을 요구하고 인증 성공 시 접근을 허용.

그러나 여기서 중요한 점은 deny가 걸리면 LDAP 인증을 요구하기 전에 차단될 수 있다는 점입니다. 또한, 사설 IP 대역에서 allow를 통과하는 경우 LDAP 인증이 전혀 수행되지 않아야 합니다.

2. 설정 개선 방안

allowdeny 지시어가 기대한 대로 동작하지 않을 경우, 접근 제어 및 인증 처리를 구분하기 위해 NGINX 설정을 조금 더 명확하게 설정해야 합니다. 다음은 문제 해결을 위한 개선된 설정 예시입니다.

http {
    ldap_server openldap_auth {
        url ldap://<ldap-server-ip>:389/ou=users,dc=example,dc=com?uid?sub?(objectClass=person);
        binddn "cn=admin,dc=example,dc=com";
        binddn_passwd "<admin-password>";
        group_attribute memberUid;
        group_attribute_is_dn on;
        require valid_user;
    }

    server {
        listen 80;
        server_name <your-server-domain>;

        location / {
            # 사설 IP 대역은 인증 없이 허용
            allow 10.0.0.0/8;
            allow 172.16.0.0/12;
            allow 192.168.0.0/16;

            # 사설 IP 이외의 경우 접근 제한 및 LDAP 인증
            deny all;

            # 조건 충족 시 하나라도 만족하면 통과
            satisfy any;

            # LDAP 인증 설정
            auth_ldap "LDAP Authentication";
            auth_ldap_servers openldap_auth;

            # 프록시로 백엔드 서비스 전달
            proxy_pass http://<backend-k8s-service>;
        }
    }
}

3. 설정 설명

  • allow 지시어는 사설 IP 대역을 허용합니다. 이 대역에 포함된 IP는 LDAP 인증을 요구하지 않고 바로 접근을 허용합니다.
  • deny all 지시어는 모든 외부 IP에 대해 기본적으로 접근을 차단합니다. 그러나 satisfy any 설정 덕분에, 이 IP들이 auth_ldap 인증을 통과하면 접근할 수 있습니다.
  • satisfy any 지시어는 allow 조건을 만족하거나, LDAP 인증이 성공하는 조건 중 하나만 충족하면 접근을 허용합니다.
    • 사설 IP 대역이면 allow에 의해 통과.
    • 외부 IP 대역이면 auth_ldap에 의해 인증을 요구.

4. 설정 적용 및 테스트

  1. NGINX 설정 테스트: 설정이 올바르게 적용되었는지 확인하기 위해 테스트 명령을 실행하세요.
     sudo nginx -t
  2. NGINX 재시작: 설정이 올바르게 적용되었다면 NGINX를 다시 로드하여 새로운 설정을 적용합니다.
     sudo systemctl reload nginx
  3. 테스트: 사설 IP 대역(예: 10.x.x.x, 172.x.x.x, 192.168.x.x)에서 접근 시 인증 없이 통과되는지 확인하고, 외부 IP에서 접근할 경우 LDAP 인증을 요구하는지 확인합니다.

5. SSL 문제도 함께 고려

만약 SSL을 사용하는 경우, SSL 설정도 점검해야 합니다. SSL 관련 설정이 잘못되었거나 인증서가 올바르게 구성되지 않은 경우 SSL 핸드셰이크가 실패할 수 있습니다.

ssl_certificate /path/to/cert.crt;
ssl_certificate_key /path/to/cert.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

이 설정을 통해 외부 접근에만 LDAP 인증을 요구하도록 설정할 수 있으며, 사설 IP에서는 인증 없이 접근할 수 있습니다.

 

Kubernetes에 다양한 서비스에 대해 공통적으로 인증 기능을 적용하려면, Ingress에 인증 프록시를 설정하여 내부 아이피 대역은 인증 없이 접근을 허용하고, 외부 아이피는 인증을 요구하는 방식을 구현하는 것이 효과적입니다. 이 방식으로 하나의 인증 시스템을 통해 모든 서비스에 대한 접근을 관리할 수 있습니다. 이를 위해 oauth2-proxy와 Ingress Controller를 연동하여 내부 사용자와 외부 사용자에 대한 인증을 효과적으로 처리할 수 있는 방법입니다.

  1. oauth2-proxy 설정 및 배포: OAuth 2.0, OIDC, LDAP 인증을 지원하는 프록시 서버인 oauth2-proxy를 사용하여 Ingress와 연동.
  2. Ingress Controller 설정: 모든 외부 요청은 인증 프록시를 거치고, 내부 아이피 대역에 대해서는 인증 없이 접근을 허용하도록 설정.
  3. 공통 인증 적용: Ingress에서 제공하는 인증 기능을 사용하여, 각 서비스에 동일한 인증 방식을 적용.

oauth2-proxy 배포 및 설정

oauth2-proxy를 사용하면 Google, GitHub, LDAP 등 다양한 인증 제공자를 통해 인증을 수행할 수 있습니다. oauth2-proxy Helm Chart를 사용하여 Kubernetes 클러스터에 배포합니다. 위에서 clientIDclientSecret은 사용 중인 인증 제공자(Google, GitHub 등)와 연결된 정보입니다. LDAP을 사용하는 경우 LDAP 관련 설정을 추가해야 합니다.

 

oauth2-proxy.cfg 파일을 작성합니다.

 helm repo add oauth2-proxy https://oauth2-proxy.github.io/manifests
 helm install oauth2-proxy oauth2-proxy/oauth2-proxy \
     --set config.clientID=<your-client-id> \
     --set config.clientSecret=<your-client-secret> \
     --set config.cookieSecret=$(openssl rand -base64 32)

oauth2-proxy 설정 파일 예시

 provider = "google"  # 사용할 인증 제공자
 client_id = "<your-client-id>"
 client_secret = "<your-client-secret>"
 cookie_secret = "<your-cookie-secret>"
 email_domains = ["example.com"]
 upstreams = "static://200"  # 인증 성공 시 허용 응답 설정

Ingress Controller 설정 및 내부/외부 IP 구분

Ingress Controller에 oauth2-proxy를 연동하여 외부 IP에서 접근할 때만 인증을 요구하고, 내부 IP 대역에서는 인증을 요구하지 않도록 설정합니다. nginx.ingress.kubernetes.io/auth-urlnginx.ingress.kubernetes.io/auth-signin을 사용하여 인증 URL을 지정합니다.

 apiVersion: networking.k8s.io/v1
 kind: Ingress
 metadata:
   name: example-ingress
   annotations:
     nginx.ingress.kubernetes.io/auth-url: "https://oauth2-proxy.example.com/oauth2/auth"
     nginx.ingress.kubernetes.io/auth-signin: "https://oauth2-proxy.example.com/oauth2/start?rd=$request_uri"
     nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"  # 내부 IP 대역
 spec:
   rules:
   - host: example.com
     http:
       paths:
       - path: /
         pathType: Prefix
         backend:
           service:
             name: example-service
             port:
               number: 80
  • nginx.ingress.kubernetes.io/auth-url: oauth2-proxy의 인증 URL을 지정하여, 외부 접근 시 인증이 필요하도록 설정.
  • nginx.ingress.kubernetes.io/auth-signin: 인증 페이지로 리다이렉트할 URL.
  • nginx.ingress.kubernetes.io/whitelist-source-range: 내부 IP 대역을 지정하여, 이 IP 대역에서 접근할 경우 인증 없이 바로 접근이 가능하도록 설정.

공통 인증 적용 방식 테스트

이제 Ingress Controller와 oauth2-proxy가 연동되었으므로 다음을 확인합니다.

  1. 내부 IP 대역에서 테스트: 사설 IP(예: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)에서 접근할 경우, 인증 없이 서비스에 접근할 수 있는지 확인합니다.
  2. 외부 IP 대역에서 테스트: 외부 IP에서 접근할 경우, oauth2-proxy가 인증을 요구하는지 확인합니다.

이 구성을 통해 모든 서비스에 대해 인증을 일관되게 적용할 수 있으며, 내부 네트워크에 대해서는 인증을 생략할 수 있습니다.

728x90

댓글