어라, 인스턴스 시작/정지/삭제가 아무나 다 되어버리네
openstack 구축 후, 유저를 만들고 로그인 해서 인스턴스도 만들고 네트워크도 설정해보고 볼륨도 만들어서 attach 시켜보고 등등 여러가지 해본 결과 특별한 문제 없이 잘 돌아갔다.
그런데 혹시나 싶어 다른 유저를 생성하여 접속해서 이전의 유저가 작성한 인스턴스를 삭제해보니 이거 왠걸, 기동/정지/삭제 모두 다 되어 버린다. 사내에서만 운영하는 것이라 특별히 신경은 쓰지 않았지만 이건 좀 안되겠다 싶어 조사를 해 보았다.
policy.json에서 권한 제어가 가능
관리자 화면에서 role이 있기는 한데 도대체 권한 설정하는 화면이 보이질 않는다. 여기저기 알아 본 결과 컨트롤러에서 각 서비스의 루트 디렉토리 밑에 policy.json 파일을 작성 하는 것으로 각 서비스에 대한 권한 설정이 가능하다는 것을 알았다.
예를 들면 nova 서비스는 /etc/nova/policy.json에서 제어하고 glance 서비스는 /etc/glance/policy.json 파일에서 제어된다. 다른 서비스는 기본적으로 policy.json 파일이 어느정도 정의 되어 있었지만 nova의 경우에는 아무것도 적혀있지 않아서 모든 유저에게 모든 권한이 허가된 상황이었던 듯 하다.
일단 급한대로 인터넷에서 검색한 대로 nova용 policy.json을 작성하였다.
{
"context_is_admin": "role:admin",
"admin_or_owner": "is_admin:True or project_id:%(project_id)s",
"default": "rule:admin_or_owner",
"compute:attach_volume": "rule:admin_or_owner",
"compute:detach_volume": "rule:admin_or_owner",
"compute:update": "rule:admin_or_owner",
"compute:soft_delete": "rule:admin_or_owner",
"compute:delete": "rule:admin_or_owner",
"compute:restore": "rule:admin_or_owner",
"compute:force_delete": "rule:admin_or_owner",
"compute:start": "rule:admin_or_owner",
"compute:stop": "rule:admin_or_owner",
"compute:backup": "rule:admin_or_owner",
"compute:snapshot": "rule:admin_or_owner",
"compute:rebuild": "rule:admin_or_owner",
"compute:revert_resize": "rule:admin_or_owner",
"compute:confirm_resize": "rule:admin_or_owner",
"compute:resize": "rule:admin_or_owner",
"compute:add_fixed_ip": "rule:admin_or_owner",
"compute:remove_fixed_ip": "rule:admin_or_owner",
"compute:pause": "rule:admin_or_owner",
"compute:unpause": "rule:admin_or_owner",
"compute:suspend": "rule:admin_or_owner",
"compute:resume": "rule:admin_or_owner",
"compute:rescue": "rule:admin_or_owner",
"compute:unrescue": "rule:admin_or_owner",
"compute:set_admin_password": "rule:admin_or_owner",
"compute:inject_file": "rule:admin_or_owner",
"compute:lock": "rule:admin_or_owner",
"compute:unlock": "rule:admin_or_owner",
"compute:get_lock": "rule:admin_or_owner",
"network:create": "",
"network:delete": "rule:admin_api",
"network:associate": "",
"network:disassociate": ""
}
- 「:」을 기준으로 오른쪽의 정의를 왼쪽의 변수에 대입하는 형식이다.
- project_id이전에는 user_id라는 정의가 있었는데 최신버전의 openstack에서는 user_id를 지원하지 않을 예정이니 project_id를 이용하자.
- 파일을 변경하여 저장하는 것만으로 적용된다. 액션이 발생할 때마다 파일을 참조하는 형식이니 서비스를 재시작할 필요가 없다.
- 여러가지 사용가능한 시스템 변수를 이용하면 상세하게 권한제어가 가능할 듯 하지만 AWS와 비교하면 의외로 불편한 구석이 있는 듯 하다(당연한건가).
어딘가에 policy.json을 작성하기 위한 각 서비스 별 레퍼런스가 있으면 좋겠는데 현재까지는 발견하지 못하였다. 발견하면 링크를 추가할 예정.
'IT이야기 > 클라우드' 카테고리의 다른 글
slack+slash command+API Gateway를 이용한 SSM 명령실행 (1) | 2020.08.19 |
---|---|
AWS 서비스용 VPC 및 Subnet 생성 (0) | 2020.07.31 |
OpenStack nova 서비스의 policy.json (0) | 2020.07.31 |
AWSの放置されたEBSをchatworkへ定期的に通知 (0) | 2020.07.30 |
댓글