配置中心作为基础服务,存储着公司非常重要的配置信息,所以安全因素需要大家重点关注,Apollo提供多方面的实践
1 认证
1.1 使用Apollo提供的Spring Security简单认证
可能很多公司并没有统一的登录认证系统,如果自己实现一套会比较麻烦。Apollo针对这种情况,从0.9.0开始提供了利用Spring Security实现的Http Basic简单认证版本。
从0.9.0版开始之后执行完Apollo的sql脚本之后,能使用apollo/admin登录Apollo管理界面。
1.2 使用SSO方式登录
在官方文档中说道
- SSO会提供一个jar包,需要配置一个filter
- filter会拦截所有请求,检查是否已经登录
- 如果没有登录,那么就会跳转到SSO的登录页面
- 在SSO登录页面登录成功后,会跳转回apollo的页面,带上认证的信息
- 再次进入SSO的filter,校验认证信息,把用户的信息保存下来,并且把用户凭证写入cookie或分布式session,以免下次还要重新登录
- 进入Apollo的代码,Apollo的代码会调用UserInfoHolder.getUser获取当前登录用户
注意,以上1-5这几步都是SSO的代码,不是Apollo的代码,Apollo的代码只需要你实现第6步。
其实当执行UserInfoHolder.getUser的时候已经完成了Spring Security登录的过滤链,通过查看代码AuthConfiguration可知Apollo通过不同的profile来实现登录方法的初始化,因此可以通过在代码中追加自定义的SSO逻辑链路来支持SSO登录,由于篇幅较大,日后时间会写另外一遍博文进行阐述。
除此之外Apollo还提供了LDAP和OIDC的登录,鉴于作者目前碰到的系统少有使用,所以就不做讨论。
2 授权
2.1 用户管理
在http://127.0.0.1:8070/user-manage.html中新增访问系统的用户
2.2 项目管理员权限
创建项目时填写的应用负责人默认会成为项目的管理员之一,如果还需要其他人也成为项目管理员,可以按照下面步骤操作:
进入管理项目页面
追加用户到管理员当中
2.3 编辑、发布权限授权
项目管理员拥有细分权限的赋权权限,因此如果只允许其只有发布或编辑某个权限,那么就在对应配置上面给予对应账号权限即可
没有发布权限
没有编辑权限
2.4 查看权限
从1.1.0版本开始,apollo-portal增加了查看权限的支持,可以支持配置某个环境只允许项目成员查看私有Namespace的配置。 这里的项目成员是指: 项目的管理员 具备该私有Namespace在该环境下的修改或发布权限
通过追加环境来禁止人员查看配置,在管理员工具-》系统参数的configView.memberOnly.envs
没有查看权限的时候
拥有查看权限的时候
3 系统访问
3.1 敏感配置访问
Apollo从1.6.0版本开始增加访问密钥机制,从而只有经过身份验证的客户端才能访问敏感配置。如果应用开启了访问密钥,客户端需要配置密钥,否则无法获取配置。
在管理秘钥页面启用秘钥
所有尝试拉取该环境配置的服务将会被拒绝
reason: java.io.IOException: Server returned HTTP response code: 401 for URL
需要在客户端进行配置,方能正常拉取配置
apollo:
accesskey:
secret: 098f6bcd4621d373cade4e832627b4f6 #在portal中的环境秘钥
3.2 admin-service访问控制
1.7.1及以上版本可以考虑为
apollo-adminservice
开启访问控制,从而只有受控的apollo-portal
才能访问对应接口,增强安全性
admin-service.access.control.enabled默认为fale,当设置为true的时候并且同时设置admin-service.access.tokens将可以设置admin-service访问控制
在portal的日志和界面都会提示无法访问
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://172.16.0.5:8090/health": Connect to 172.16.0.5:8090 [/172.16.0.5] failed: Connection refused (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to 172.16.0.5:8090 [/172.16.0.5] failed: Connection refused (Connection refused)
通过在数据库设置对应的token来进行访问
{"dev" : "098f6bcd4621d373cade4e832627b4f6"}
引用:https://www.apolloconfig.com/#/zh/usage/apollo-user-guide?id=_71-安全相关