DBMS/Cassandra
[Cassandra] 인증/권한 설정하기
seungh0
2022. 9. 30. 22:04
반응형
기본적으로 카산드라를 설치하면 인증/권한 설정이 되어 있지 않습니다. 인증/권한 설정을 하기 위한 방법입니다.
부주의로 운영 테이블에 DROP TABLE을 날린다거나... 등의 사고를 방지하기 위해서 인증/권한 설정은 필수입니다.
(사람은 (특히 나 자신...) 언제나... 실수를 할 수 있기 때문에, 시스템적으로 사람의 실수를 최대한 막을 수 있어야 한다고 생각합니다 ㅎㅎ)
system_auth keyspace에 대한 RF 변경 (무적권 해야함!!!)
alter keyspace "system_auth" WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': '3'}
- system_auth에 대한 RF를 변경해줘야 한다 (기본 SimpleStrategy에 RF: 1로 설정되어 있음)
- (위의 예시에서 dc1, dc2와 RF는 설정한 멀티존에 맞게 변경 필요)
안하는 경우.. system_auth 복제본이 속한 1개의 노드가 다운되면 전체 클러스터에서 인증/권한 체크가 실패해서 카산드라 전체 장애가 발생할 수 있습니다.
cassandra.yaml 설정 변경
authenticator: PasswordAuthenticator
authorizer: CassandraAuthorizer
- authenticator: AllowAllAuthenticator -> PasswordAuthenticator로 변경한다
- authorizer: AllowAllAuthorizer -> CassandraAuthorizer로 변경한다
카산드라를 재시작합니다.
sudo systemctl restart cassandra
설정을 바꾸고, 카산드라에 계정 없이 cqlsh 접속하려 하면 다음과 같은 에러가 발생합니다.
cqlsh
Connection error: ('Unable to connect to any servers', {'127.0.0.1:9042': AuthenticationFailed('Remote end requires authentication',)})
(클러스터 기준 최초 인증 설정시) 기본적으로 cassandra/cassandra로 SuperUser가 생성됩니다. 다음과 같이 접속합니다.
cqlsh -u cassandra -p cassandra
루트 계정/일반 계정 생성하기
- 기본적으로 생성되는 SuperUser를 삭제하고, 새로운 SuperUser를 생성합니다.
create user root with password 'password' SUPERUSER; # 새로운 Superuser 계정을 생성한다
cqlsh -u root -p password
drop user cassandra # 기본 cassandra 계정을 삭제한다
create user will with password 'password' NOSUPERUSER; # NoSuperUser 일반 계정을 생성한다
- NoSuperUser 계정을 생성하면 기본적으로 아무 권한이 없게 생성된다.
Role 확인 방법
select * from system_auth.role_permissions;
권한 부여(Grant) 방법 + 예시
GRANT permissions ON resource TO role_name
permissions ::= ALL [ PERMISSIONS ] | permission [ PERMISSION ]
permission ::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESCRIBE | EXECUTE
resource ::= ALL KEYSPACES
| KEYSPACE keyspace_name
| [ TABLE ] table_name
| ALL ROLES
| ROLE role_name
| ALL FUNCTIONS [ IN KEYSPACE keyspace_name ]
| FUNCTION function_name '(' [ cql_type( ',' cql_type )* ] ')'
| ALL MBEANS
| ( MBEAN | MBEANS ) string
ex) GRANT SELECT ON KEYSPACE test TO 'will';
GRANT MODIFY ON ALL KEYSPACES TO 'developer_rw';
GRANT SELECT ON KEYSPACE {{KEYSPACE}} TO 'developer_rw';
권한 회수(Revoke) 방법 + 예시
REVOKE permissions ON resource FROM role_name;
REVOKE SELECT ON KEYSPACE test FROM 'will';
권한들과 해당 범위
Previlege | Resource | Permissions |
ALTER KEYSPACE | ALTER | ALL KEYSPACES, or KEYSPACE |
ALTER TABLE | ALTER | ALL KEYSPACES, KEYSPACE, or TABLE |
CREATE KEYSPACE | CREATE | ALL KEYSPACES |
CREATE ROLE | CREATE | ALL ROLES |
CREATE TABLE | CREATE | ALL KEYSPACES, KEYSPACE |
DROP KEYSPACE | DROP | ALL KEYSPACES, or KEYSPACE |
DROP ROLE | DROP | ALL ROLES, or ROLE |
DROP TABLE | DROP | ALL KEYSPACES, KEYSPACE, or TABLE |
GRANT PERMISSION or REVOKE PERMISSION on ALL KEYSPACES | AUTHORIZE | ALL KEYSPACES |
GRANT PERMISSION or REVOKE PERMISSION on ALL ROLES | AUTHORIZE | ALL ROLES |
GRANT PERMISSION or REVOKE PERMISSION on a keyspace | AUTHORIZE | ALL KEYSPACES, or KEYSPACE |
GRANT PERMISSION or REVOKE PERMISSION on a role | AUTHORIZE | ALL ROLES, or ROLE |
GRANT PERMISSION or REVOKE PERMISSION on a table | AUTHORIZE | ALL KEYSPACES, KEYSPACE, or TABLE |
GRANT ROLE or REVOKE ROLE | AUTHORIZE | ALL ROLES, or ROLE |
INSERT, UPDATE, DELETE, or TRUNCATE | MODIFY | ALL KEYSPACES, KEYSPACE, or TABLE |
LIST ROLES (not yet implemented) | DESCRIBE | ALL ROLES |
SELECT | SELECT | ALL KEYSPACES, KEYSPACE, or TABLE |
그냥 예시로만 참고.
계정 | 권한 |
root | 루트 계정 (SUPER USER) |
application | 애플리케이션 계정, (SELECT, MODFIY 권한) |
developer_rw | 개발자 쓰기 모드 계정 (SELECT, MODIFY, CREATE, ALTER, DROP 권한) |
developer_ro | 개발자 읽기 모드 계정 (SELECT 권한) |
create user root with password '{{PASSWORD}}' SUPERUSER;
create user application with password '{{PASSWORD}}' NOSUPERUSER;
create user developer_rw with password '{{PASSWORD}}' NOSUPERUSER;
create user developer_ro with password '{{PASSWORD}}' NOSUPERUSER;
drop user cassandra;
GRANT SELECT ON KEYSPACE {{KEYSPACE_NAME}} TO 'application';
GRANT MODIFY ON KEYSPACE {{KEYSPACE_NAME}} TO 'application';
GRANT SELECT ON ALL KEYSPACES TO 'developer_rw';
GRANT MODIFY ON ALL KEYSPACES TO 'developer_rw';
GRANT CREATE ON ALL KEYSPACES TO 'developer_rw';
GRANT ALTER ON ALL KEYSPACES TO 'developer_rw';
GRANT DROP ON ALL KEYSPACES TO 'developer_rw';
GRANT SELECT ON ALL KEYSPACES TO 'developer_ro';
주의 사항
MODIFY 권한에 Truncate 권한이 포함되어 있다.
- MODIFY 권한이 부여되면 INSERT, UPDATE, DELETE 권한 뿐만 아니라 TRUNCATE 권한도 포함된다. 주의가 필요하다.
system_auth keyspace에 대한 적정 RF 변경 필요 (반복)
alter keyspace "system_auth" WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': '3'}
- system_auth에 대한 RF를 변경해줘야 한다 (기본 SimpleStrategy에 RF: 1로 설정되어 있음)
- (위의 예시에서 dc1, dc2와 RF는 설정한 멀티존에 맞게 변경 필요)
반응형