Bootstrap

15 分钟部署一个 CAS 服务并对接 Shibboleth-IdP 3.4.6

前言

这是一个标题党。

CAS 是一个经典的单点登录方案,又有  的支持,因此广大提供统一身份认证解决方案的供应商鲜有不支持 CAS 的——至少投标方案上是这样的。尽管如此,实际对接的时候可能会遇到问题,又或者 CAS 不归自己负责,想做个测试又不太方便接入生产环境,总之这时候就特别想要自己部署一个测试的 CAS 来进行验证。

是的,搭一个 CAS 服务器 15 分钟就够了。

注意下文部署的 CAS 仅适合测试,不要拿这个 CAS 直接用作生产环境哦。

cas-overlay

尽管 CAS 的功能极多且复杂,但是如果只考虑测试话,我们可以尽量简化他的配置。我们只引入 和 模块,并打包成  以简化环境配置。

考虑到测试方便,我们把  和  安装在同一台服务器,因此使用了  来对两者进行代理。

本文假定已经安装好了  ,并使用  方式代理发布。

git clone https://github.com/apereo/cas-overlay-template.git
cd cas-overlay-template/
git checkout 6.1

dependencies {
    // Other CAS dependencies/modules may be listed here...
     compile "org.apereo.cas:cas-server-support-json-service-registry:${casServerVersion}"
     compile "org.apereo.cas:cas-server-support-ldap:${casServerVersion}"
}

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

$ sudo yum install docker-ce docker-ce-cli containerd.io
$ sudo systemctl start docker

修改  配置文件。由于我们使用  代理  服务,所以我们这里可以让  卸载掉  ,  服务运行在  上即可。同时加载  目录的服务注册配置。

最后一行表示  所释放的属性,倒数第二行表示  内属性和  的映射关系。例如如果用 AD 的话,那么这里可以配成 ,此时  所释放的属性名依然是 ,由  映射产生。

server.port=8080
server.ssl.enabled=false
cas.server.tomcat.http.enabled=false

cas.server.name=https://idp.exmaple.org
cas.server.prefix=${cas.server.name}/cas

logging.config: file:/etc/cas/config/log4j2.xml

cas.serviceRegistry.initFromJson=false
cas.serviceRegistry.json.location=file:/etc/cas/services

cas.authn.ldap[0].type=AUTHENTICATED
cas.authn.ldap[0].ldapUrl=ldap://ldap.example.org:389
cas.authn.ldap[0].useSsl=false
cas.authn.ldap[0].baseDn=dc=example,dc=org
cas.authn.ldap[0].searchFilter=uid={user}
cas.authn.ldap[0].bindDn=cn=admin,dc=example,dc=org
cas.authn.ldap[0].bindCredential=password
cas.authn.ldap[0].principalAttributeList=employeeType:employeeType,uid:uid,sn:sn
cas.authn.attributeRepository.defaultAttributesToRelease=employeeType,uid,sn

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^(https)://idp.example.org.*"
  "name" : "idp",
  "id" : 1001,
  "evaluationOrder" : 10
}

Successfully built 6c1396544479
Successfully tagged org.apereo.cas/cas:6.1.4
Built CAS image successfully tagged as org.apereo.cas/cas:6.1.4
REPOSITORY           TAG                 IMAGE ID            CREATED                  SIZE
org.apereo.cas/cas   6.1.4               6c1396544479        Less than a second ago   247MB

由于我们和  装在一起,而  的  已经占用了  端口,所以将其映射到  上。

$ docker run -d -p 8081:8080 --name="cas" org.apereo.cas/cas:6.1.4
$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                              NAMES
8ed61668ad65        org.apereo.cas/cas:6.1.4   "java -server -nover…"   3 seconds ago       Up 2 seconds        8443/tcp, 0.0.0.0:8081->8080/tcp   cas

如果修改配置,则重新构建 ,再重新运行构建好的容器即可。由于底层已经构建过,此时只替换了配置文件,所以速度是很快的。然后停掉当前容器,删除之再重新拉起即可。

$ docker stop cas
cas
$ docker rm cas
cas
$ docker run -d -p 8081:8080 --name="cas" org.apereo.cas/cas:6.1.4

这些过程实际上也就是  内的内容,大家可以根据实际情况修改后。直接执行该脚本即可。

        ProxyPreserveHost On
        RequestHeader set X-Forwarded-Proto https
        RemoteIPHeader X-Forwarded-For

        ProxyPass "/cas/" "http://localhost:8081/cas/"

对接 Shibboleth-IdP 3.4.6

我们使用  插件来对接 IdP 和 CAS。由于 IdP 3.4.3 之后有一个内部 API 变更,因此插件的配置有大幅调整,实际上变得更简单了。实测表明新版版的插件(3.3.0)还修复了一些老版本的 bug——比如一个 CAS 属性无法同时映射给两个 IdP 属性的问题。建议大家尽量选择升级 IdP 到 3.4.6 后使用新版插件对接。

准备工作

  • 下载相关的  和 文件备用。

  • 下载  文件备用

以下假定 IdP 安装在 

  • IdP 版本至少 3.4.6

安装

  • 把下载的  放入  中

  • 把下载的  和  放入  中

  • 将  拷贝到 

cp /opt/shibboleth-idp/dist/webapp/WEB-INF/web.xml /opt/shibboleth-idp/edit-webapp/WEB-INF/web.xml
  • 修改  增加以下部分

...
    
    
        ShibCas Auth Servlet
        net.unicon.idp.externalauth.ShibcasAuthServlet
        2
    
    
        ShibCas Auth Servlet
        /Authn/External/*
    
...
  • 修改 idp.properties 配置文件

idp.authn.flows = External

shibcas.casServerUrlPrefix = https://idp.example.org/cas
shibcas.casServerLoginUrl = ${shibcas.casServerUrlPrefix}/login

# idp 的地址
shibcas.serverName = https://idp.example.org

# 如果不支持 cas3.0 协议,这里修改为 cas20 并取消注释
# shibcas.ticketValidatorName = cas30

运行  重新编译  ,然后重启  即可

属性映射

直接映射

 中的  为从插件中获取属性的配置,例如下面的示例表示将  释放的  映射为 

   
        
        
   

作为引用

如果  在属性释放时还需要进行一些特殊转换,即  或者  等,那么可以先讲属性映射进来,再作为其他  的  的引入,例如下面这个示例:先将  获取到之后,标注为,然后引入到 中进行脚本计算。

    
        
        
        
        
    
    

参考文献

以上

原文于2020年3月首发于,搬家存档。

行文有微调。