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는 설정한 멀티존에 맞게 변경 필요)
반응형