【 云原生 kubernetes 】- 单点登录Authelia + OpenLdap

文章目录

    • 简介
      • Authelia
      • OpenLdap
        • 属性介绍
    • Helm部署
      • openldap
        • 配置调整
        • 数据持久化
        • 部署
        • 使用
          • 命令行
          • Web
      • Authelia
    • 页面访问
    • 反向代理进行集成
      • 流程

⚡️: OpenLDAP是轻量级目录访问协议(LDAP)的开源实现,它提供了一种存储和访问关于用户、组、计算机和其他资源的信息的中心化目录服务。

简介

Authelia

​ Authelia是一个开源的单点登录身份验证系统,可以用于保护Web应用程序、API和其他服务。它提供了多种身份验证方法,包括双因素身份验证、LDAP和SAML集成、OAuth2等,并且支持自定义主题和模板以实现与自己的品牌一致的UI。

OpenLdap

属性介绍

  • cn(common name):通用名称,表示一个对象的名称。在用户条目中,通常与用户的姓名相对应;在组条目中,则与组名相对应。
  • ou(organizational unit):组织单位,表示一个组织或部门。在LDAP目录服务中,可以使用ou来创建多级组织结构,并将用户和其他对象分配到相应的组织单元中,以便更好地管理它们。
  • dc(domain component):域组件,表示域名的一部分。在LDAP中,域名通常是按照层次结构组织的,例如:example.com可以被拆分为dc=example,dc=com。这样做有利于有效地组织和管理大规模的目录服务。
  • sn(surname):姓氏,表示一个人的姓氏。与cn属性不同,sn只表示姓氏,而且通常不唯一。

Helm部署

openldap

  • helm repo add stable https://charts.helm.sh/stable
  • helm install openldap stable/openldap

部署十分简单,但是我们可能需要调整Helm chart配置,所以建议把包拉取到本地调整之后再进行部署,下面是详细流程

[root@ycloud ~]# helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories
[root@ycloud ~]# helm pull stable/openldap
[root@ycloud ~]# tar -zxvf openldap-1.2.7.tgz 
openldap/Chart.yaml
openldap/values.yaml
openldap/templates/NOTES.txt
openldap/templates/_helpers.tpl
openldap/templates/configmap-customldif.yaml
openldap/templates/configmap-env.yaml
openldap/templates/deployment.yaml
openldap/templates/pvc.yaml
openldap/templates/secret.yaml
openldap/templates/service.yaml
openldap/templates/tests/openldap-test-runner.yaml
openldap/templates/tests/openldap-tests.yaml
openldap/.helmignore
openldap/README.md
[root@ycloud ~]# cd openldap/ ;ls
charts  Chart.yaml  README.md  templates  values.yaml

配置调整

刚刚我们拉取的Chart包 部署openldap,需要调整的地方不是很多

env:
  LDAP_ORGANISATION: "GStrain Inc."
  LDAP_DOMAIN: "ldap-openldap.authelia"
  LDAP_BACKEND: "hdb"
  LDAP_TLS: "false"
  LDAP_TLS_ENFORCE: "false"
  LDAP_REMOVE_CONFIG_AFTER_SETUP: "false"

⚡️: LDAP_DOMAIN是指LDAP目录服务中的域名,它用于标识和区分不同的组织、部门或用户。

案例:cn=username,ou=department,dc=domain,dc=com

其中dc=domain,dc=com部分就是LDAP_DOMAIN,我们只需要注意这一部分,其他根据自己情况选择。

数据持久化

当我添加pvc来做数据持久化,一直提示没有权限,暂时没能解决。

chown: changing ownership of ‘/var/lib/ldap/data’: Operation not permitted

只好退而求其次,使用hostPath来针对pod做持久化

...
    - hostPath:
        path: /data/openldap
        type: DirectoryOrCreate
      name: data
...

部署

helm chart调整好之后,我们只需要一个命令就可以进行安装部署

  • helm install

使用

OpenLdap 有很多第三方的控制工具,也可以使用命令行来进行操作,我这里推荐使用的是 Apache Directory Studio, 下面是一些简单的使用案例:

命令行
ldapadd -x -D "cn=admin,dc=ldap-openldap,dc=authelia" -w "W58jkiat0wt0hkUXSBUwJBbVFhaEmDr8" <<EOF
dn: uid=ycloud,ou=ycloud,dc=ldap-openldap,dc=authelia
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
cn: ycloud
sn: User
givenName: ycloud
uid: ycloud
userPassword: {SHA}ICy5YqxZB1uWSwcVLSNLcA==
ou: ycloud
EOF

这是一个简单的添加功能

Web

使用WEB,查看我们刚刚添加的用户属性,针对我们部署的openldap进行连接。

【 云原生 kubernetes 】- 单点登录Authelia + OpenLdap_第1张图片

Authelia

整体跟OpenLdap部署流程是一致的,配置中我们只需要调整,authelia绑定的ldap信息,所以我们这里只提供下最终的配置文件

  • helm repo add truecharts https://charts.truecharts.org/
  • helm install authelia truecharts/authelia --version 15.1.29
---
theme: light


default_redirection_url: ""
default_2fa_method: 'totp'
server:
  host: 0.0.0.0
  port: 9091
  path: auth
  asset_path: ''

  headers:
    csp_template: ''
  buffers:
    read: 4096
    write: 4096
  tls:
    key: "/app/ssl/tls.key"
    certificate: "/app/ssl/tls.crt"
  timeouts:
    read: 6s
    write: 6s
    idle: 30s
  enable_pprof: false
  enable_expvars: false
log:
  level: debug
  format: text
  file_path: ''
  keep_stdout: true
  

totp:
  disable: false
  issuer: shmao.net
  algorithm: sha1
  digits: 6
  period: 30
  skew: 1
  secret_size: 32
webauthn:
  disable: false
  display_name: Authelia
  attestation_conveyance_preference: indirect
  user_verification: preferred
  timeout: 60s
ntp:
  address: time.cloudflare.com:123
  version: 4
  max_desync: 3s
  disable_startup_check: false
  disable_failure: false
authentication_backend:
  password_reset:
    disable: false
    custom_url: ''
  ldap:
    implementation: activedirectory
    url: ldap://ldap-openldap:389
    timeout: 5s
    start_tls: false
    tls:
      server_name: ''
      skip_verify: false
      minimum_version: TLS1.2
      maximum_version: TLS1.3
    base_dn: dc=ldap-openldap,dc=authelia
    additional_users_dn: OU=ycloud
    permit_referrals: false
    permit_unauthenticated_bind: false
    permit_feature_detection_failure: false
    users_filter: "(&({username_attribute}={input})(objectClass=person))"
    username_attribute: uid
    user: CN=admin,DC=ldap-openldap,DC=authelia



password_policy:
  standard:
    enabled: false
    min_length: 8
    max_length: 0
    require_uppercase: true
    require_lowercase: true
    require_number: true
    require_special: true
  zxcvbn:
    enabled: false
    min_score: 0
session:
  name: 'authelia_gs_session'
  domain: 'shmao.net'
  same_site: 'lax'
  expiration: 1h
  inactivity: 5m
  remember_me_duration: 1M
  redis:
    host: redis-master
    port: 6379
    username: default
    password: qweasdzxc


  
regulation: 
  ban_time: 5m
  find_time: 2m
  max_retries: 3
storage:
  mysql:
    host: mysql
    port: 3306
    database: authelia
    username: root
    timeout: 5s
...

  • server:设置Authelia服务器的相关参数,包括主机名、端口号、路径、SSL证书等。
  • totp:启用或禁用基于时间的一次性密码(TOTP)身份验证,并设置相关参数,如加密算法、密码周期等。
  • webauthn:启用或禁用WebAuthn身份验证,并设置相关参数,如认证器名称、用户验证方式等。
  • ldap:设置LDAP身份验证后端的相关参数,包括LDAP服务器的URL、基本DN、用户名属性、过滤器等。
  • password_policy:设置密码策略,包括标准模式和zxcvbn模式两种,可以设置最小长度、大小写字母、数字和特殊字符等要求。
  • session:设置会话参数,如名称、域名、过期时间等。
  • regulation:设置访问限制参数,包括失败尝试次数、封禁时间、发现时间等。
  • storage:设置存储参数,包括MySQL数据库的连接信息。
  • notifier:设置通知功能的参数,包括SMTP服务器的连接信息、身份验证器等。

部署好之后我们先查看一下我们的应用是否正常,然后针对端口进行访问尝试

[root@sztcyl-177-9-244 authelia]# kubectl get svc -n authelia
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                       AGE
authelia         NodePort    10.253.246.20    <none>        80:5716/TCP                   37d
ldap-openldap    NodePort    10.253.165.233   <none>        389:36300/TCP,636:26749/TCP   25d
mysql            ClusterIP   10.253.43.75     <none>        3306/TCP                      38d
mysql-headless   ClusterIP   None             <none>        3306/TCP                      38d
redis-headless   ClusterIP   None             <none>        6379/TCP                      38d
redis-master     ClusterIP   10.253.129.138   <none>        6379/TCP                      38d
redis-replicas   ClusterIP   10.253.85.35     <none>        6379/TCP                      38d
[root@sztcyl-177-9-244 authelia]# kubectl get po  -n authelia
NAME                            READY   STATUS    RESTARTS        AGE
authelia-p6qhp                  1/1     Running   0               25d
authelia-stgzs                  1/1     Running   0               25d
authelia-vxwgl                  1/1     Running   0               25d
ldap-openldap-b5f757dc9-tqnv9   1/1     Running   0               25d
mysql-0                         1/1     Running   1 (5d23h ago)   25d
redis-master-0                  1/1     Running   0               25d
redis-replicas-0                1/1     Running   0               25d
redis-replicas-1                1/1     Running   1               26d
redis-replicas-2                1/1     Running   1 (25d ago)     26d

页面访问

访问地址 https://authelia.shmao.net/auth 这里域名已经绑定到对应的 authelia 服务,访问界面会是这样

【 云原生 kubernetes 】- 单点登录Authelia + OpenLdap_第2张图片

⚡️: 这里的用户名密码就用我们上面,我们再openldap中创建的用户密码,填写之后点击登录,

【 云原生 kubernetes 】- 单点登录Authelia + OpenLdap_第3张图片

反向代理进行集成

我们需要把Authelia,针对 url 来进行单点登录控制访问权限,这里我们得用到反向代理。

流程

访问 A 地址 --> 跳转到https://authelia.shmao.net/auth --> Authelia认证接口成功

【 云原生 kubernetes 】- 单点登录Authelia + OpenLdap_第4张图片

    server {
      listen       8080 ssl;
      listen  [::]:8080 ssl;
      server_name  localhost;
      ssl_certificate      /etc/nginx/ssl/tls.crt;
      ssl_certificate_key  /etc/nginx/ssl/tls.key;
      location / {
          auth_request /auth;
          error_page 401 = /login;
          
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Authorization "Bearer $cookie_authelia_session";
          proxy_set_header Cookie $http_cookie;
          proxy_hide_header Strict-Transport-Security;
          proxy_pass http://127.0.0.1:80;
      }

      location /auth {
        internal;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
        proxy_set_header Authorization "Bearer $cookie_authelia_session";
        proxy_set_header Cookie $http_cookie;
        proxy_pass https://authelia.shmao.net/auth/api/verify;
      }

      location /login {
        return 302  https://authelia.shmao.net/auth;
      }
    }

你可能感兴趣的:(云原生,kubernetes,运维)