学习 httpd 2.4 的 authn 和 authz 机制

引子

Openstack Keystone 的 federation 是基于 httpd auth 架构而实现的。Mod_auth_shibboleth, mod_auth_openidc 是针对 SAML 和 OpenID Connect 协议而实现的httpd auth 扩展模块。因此,深入理解 http auth 机制,是运营 Keystone Federation 系统的必备技术能力。

身份认证和访问控制

验证,就是检验用户提供的身份信息,证明用户是否是其所声称的那个用户。比如,要求用户输入手机号码,然后发送验证码到用户的手机上,用户再把验证码填回到界面上,系统就可以检查手机号和验证码是否匹配。如果匹配,证明该用户就是该手机号的持有人(不考虑手机被借用或盗用的情况)。其他常见的验证方式包括,通过手机上的app扫描用户界面上的二维码;使用用户名和密码进行验证;或者使用这几种方式的组合等。

访问控制,授权,鉴权。 权限定义, 授权,将权限授予某个用户。 鉴权,就是对照用户的身份信息和其企图执行的操作或企图访问的数据,检验用户是否能继续操作或访问。比如,用户的身份信息表明其是一名市场营销部的普通专员,系统允许授权其查看营销方案资料库的公开信息部分,也允许添加营销计划跟踪数据,但不允许访问其他部门的敏感资料,比如处于筹划阶段的投资计划。鉴权之前需要先授权。通过管理员来授予用户某些权限。

授权和鉴权是一体的。设计上可以分级来实现。也就是按粗粒度 到 细粒度 来分阶段来授权和鉴权。RBAC ABAC 是两种办法。ABAC比RBAC的灵活性高,因为 ABAC 提供了比role更多的信息用于表达访问控制信息。ABAC是联邦认证通用的办法。在最后一段,需要将 attribute 映射为 app或服务可以识别的访问控制规则。

apache httpd 提供了一套基础的验证和鉴权模块,并允许使用第三方模块来实现更多功能。 mod_authn_core 和 mod_authz_core 是核心模块,提供了一套核心指令 (directive) 供所有其他的验证和鉴权模块使用。最重要的核心指令是 AuthType 和 Require。

mod_authn_core 与 验证

AuthType basic AuthType shibboleth

Other directives depends on the modules.

mod_authz_core 与 鉴权

require and Require They're the same because the apache configuration directives are case-insensitive.

Require valid-user 只要能通过身份认证即可。这意味着把鉴权的任务推后到了service 上。

Require user user1 user2 Require group group1 group2 Require ldap-group groupx

RequireAll or RequireAny

参考资料

https://httpd.apache.org/docs/current/configuring.html http://httpd.apache.org/docs/2.4/mod/mod_authn_core.html

mod_authz_core 与 鉴权

http://httpd.apache.org/docs/2.4/howto/auth.html auth overview.

http://httpd.apache.org/docs/2.4/mod/mod_authn_core.html authn. http://httpd.apache.org/docs/2.4/mod/mod_authz_core.html About Authz.

References

  1. httpd configuring: https://httpd.apache.org/docs/current/configuring.html