一. 权限介绍
1. 为什么需要授权
RAM授权
您可以通过RAM创建、管理用户账号(例如员工、系统或应用程序),并控制这些用户账号对您名下资源具有的操作权限。当您的企业存在多用户协同操作资源时,使用RAM可以让您避免与其他用户共享云账号密钥,按需为用户分配最小权限,从而降低您的企业信息安全风险。
为了更精细地管理和操作日志服务资源,您可以通过阿里云RAM产品为您名下的子账号、日志服务的RAM服务角色和用户角色赋予相应的访问权限。
STS授权
阿里云账号可以通过创建并授权用户角色的方式赋予其他云账号一定的资源权限,其他云账号扮演该角色,并为其名下的RAM用户授予AssumeRole权限之后,其他云账号或其子账号可以通过访问STS接口获取临时AK/Token,调用日志服务API接口。
通过STS授权,您可以使用临时的AK操作,而不用担心AK的泄漏问题,更加安全。
2. 有哪些的授权方式
概览
https://help.aliyun.com/document_detail/29049.html
RAM授权
https://help.aliyun.com/document_detail/47664.html
RAM自定义授权场景
https://help.aliyun.com/document_detail/89676.html
通过STS授权
https://help.aliyun.com/document_detail/47277.html
二. 问题排查
1. 配置保存不成功
1.1 检查是否为json格式
将配置粘贴到https://www.json.cn/中,检查是否有格式错误。
1.2 检查是否和样例的样式匹配
样例参考:https://help.aliyun.com/document_detail/89676.html
检查是否有多个"Action"或多个"Resource"在同一级别下。
2. 配置保存成功提示没有权限
2.1 检查是否配置了对应的权限
通常没有权限报错会提示出需要配置的具体权限,参考提示把相应的action和resource加入到授权的策略中。
{"errorCode": "Unauthorized", "errorMessage": "denied by sts or ram, action: log:GetLogStoreLogs, resource: acs:log:cn-beijing:1641920:project/project_name/logstore/logstore_name", "requestId": "5E01B161A1F9CBE3**"}
如上报错,没有log:GetLogStoreLogs权限,操作如下:
1.找到没有权限的RAM用户(https://ram.console.aliyun.com/users)
2.点击进入用户的权限管理界面
3.点击查看用户的权限策略里是否有对应的权限
action: log:GetLogStoreLogs
resource: acs:log:cn-beijing:1641920*:project/project_name/logstore/logstore_name
4.点击修改策略内容,在Statement里添加相应的权限
其中cn-beijing(region)和1641920(aliuid)可以用通配符代替。
点击确定配置生效。
2.2 常见无权限场景
2.2.1 无权限设置告警
主要注意第三个,Resource job:
https://help.aliyun.com/document_detail/109663.html
2.2.2 无权限查看服务日志(project概览页提示权限问题)
参考文档最下的授权配置,主要是没有概览页查看服务日志的权限:
https://help.aliyun.com/document_detail/85536.html
2.2.3 无权限投递oss(RAM角色配置问题)
参考文档,RAM角色没有设置对:
https://help.aliyun.com/document_detail/29002.html
参考文档中动图:
2.3 sts权限问题
2.3.1 简要介绍
注意:子账号要有 "Action": "sts:AssumeRole" 权限;角色有日志服务的权限。
sts服务代码:
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRoleSessionName("XXX");
request.setRoleArn("XXX");
AssumeRoleResponse response = client.getAcsResponse(request);
其中RoleSessionName为您设置的授权名字(自己定义的)
RoleArn为角色的名字(需要有日志服务的权限)
调用的子账号要有sts:AssumeRole权限
2.3.2 详细说明(获取临时AK和token)
1.创建角色
2.为角色添加日志服务的权限
3.获取角色的Arn
acs:ram::104**12:role/sts-test
4.创建RAM用户(https://ram.console.aliyun.com/users)
5.为RAM用户添加AliyunSTSAssumeRoleAccess权限
6.通过接口获取临时AK/Token
Java代码样例
@Controller
public class DemoController {
@ResponseBody
@RequestMapping("get")
public String get(){
String region = "cn-hangzhou";DefaultProfile profile = DefaultProfile._getProfile_(region, "ak_id", "ak_secret");
IAcsClient client = new DefaultAcsClient(profile);
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRoleSessionName("sts-test");
request.setRoleArn("acs:ram::10412:role/sts-test"**);
try {
AssumeRoleResponse response = client.getAcsResponse(request);
AssumeRoleResponse.Credentials sts = response.getCredentials();
return sts.getAccessKeyId()+","+sts.getAccessKeySecret()+","+sts.getSecurityToken();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
2.4 缓存问题
如果配置正确提示没有权限,很有可能是缓存的问题。
日志服务有很多前端机器,前端机器会缓存用户的权限信息,修改配置后,一部分机器的缓存还没有刷新。
发送请求到有缓存的前端机器上,会提示权限问题,之后机器的权限缓存会刷新一下,这个问题之后会优化解决。
权限缓存刷新工具
刷新1000次:
./sls-refresh-permissions-tool -id accessKeyID -secret accessKeySecret -e endpoint -p project -l logstore -t 1000
相关参数
https://help.aliyun.com/document_detail/29064.html
1.mac版本
2.linux版本
https://test-lichao.oss-cn-hangzhou.aliyuncs.com/permissions-tool/linux/sls-refresh-permissions-tool
3.windows版本