본문 바로가기
IT이야기/클라우드

OpenStack policy.json 파일 작성

by somick 2020. 7. 31.

어라, 인스턴스 시작/정지/삭제가 아무나 다 되어버리네

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을 작성하기 위한 각 서비스 별 레퍼런스가 있으면 좋겠는데 현재까지는 발견하지 못하였다. 발견하면 링크를 추가할 예정.

 

댓글