DB 보안 수준을 높여보자

Alex·2024년 10월 28일
0

Plaything

목록 보기
3/118

이번에 Plaything을 만들면서
채팅 내역에 대한 보안 이야기가 나왔다.

아무래도 성인 데이팅 앱이다보니 대화 내용이 관리자한테도 보여지질 않았으면 좋겠다는
요구사항이 나왔다.

그래서, 이게 실제로 가능한지 Real MySQL 책을 보면서 테스트해보기로 했다.

사용자 식별

MySQL은 사용자의 접속 지점(도메인 또는 IP주소)도 계정의 일부가 된다.

'svc_id"@'127.0.0.1'로 하면 다른 컴퓨터 계정에서는 이 아이디로 접속이 불가능해진다.
외부 컴퓨터로도 접속이 가능한 사용자를 만들려면 사용자 계정의 호스트 부분을 %로 대체하면 된다.

사용자 계정 관리

MySQL에는 데이터베이스 서버 관리자를 위한 시스템 계정과, 응용 프로그램 혹은 개발자를 위한 일반 계정이 있다. 시스템 계정은 시스템 계정과 일반 계정을 관리할 수 있지만, 일반 계정은 시스템 계정을 관리할 수 없다.

MySQL8.0부터는 CREATE USER를 통해서 유저를 만든다.

CREATE USER 'user'@'%'
IDENTIFIED WITH 'mysql_native_password' BY 'password'
REQUIRED NONE
PASSWORD EXPIRE INTERVAL 30 DAY
ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT;

IDENTIFIED WITH
사용자의 인증 방식과 비밀번호를 설정한다. 그 뒤에는 인증방식을 명시해야 하는데, MySQL 기본 인증방식을 쓰려면 by 'password'로 써야 한다.

REQUIRE

MySQL 서버에 접속할 때 암호화된 SSL/TLS 채널을 사용할지 여부를 결정한다. 만약 별도로 설정하지 않으면 비암호화 채널로 연결하게 된다. SSL 설정하지 않아도 Caching SHA-2 Authentication(디폴트 설정)을 이용하면 암호화된 채널만으로 MySQL 에 접속할 수 있다.

PASSWORD EXPIRE
비밀번호의 유효기간을 설정하는 옵션이다.

PASSWORD HISTORY
한번 사용했던 비밀번호를 재사용하지 못하게 하는 옵션이다.
DEFAULT는 시스템 변수에 저장된 개수만큼 비밀번호 이력을 저장하고, 저장된 이력에 남아있는 비밀번호는 재사용 X

PASSWORD REUSE INTERVAL
재사용 금지 기간이다.

PASSWORD REQUIRE
비밀번호가 만료됐을 때 현재 비밀번호가 필요한지 결정

ACCOUNT UNLOCK
계정을 변경할 때 계정을 사용하게 할지 말지

권한설정

보통은 DBA가 root 계정 권한을 갖고, 개발자들에게 권한을 맞춰서 계정을 준다고 한다.

//mysql 스키마 선택
use mysql;

//사용자 목록 조회
select user,host from user;


create user '사용자'@'host' identified by '비밀번호';

//ex1) 내부 접근을 허용하는 사용자 추가
create user 'test'@'localhost' identified by '0000';

//ex2) 외부 접근을 허용하는 사용자 추가
create user 'test'@'%' identified by '0000';

//ex3) 특정 ip만 접근을 허용하는 사용자 추가
create user 'test'@'123.456.789.100' identified by '0000';

//ex4) 특정 ip 대역을 허용하는 사용자 추가
create user 'test'@'192.168.%' identified by '0000';

우선, 어떻게 될지 모르니 외부 접근을 허용하는 사용자를 만들겠다.

GRANT SELECT, INSERT, UPDATE, DELETE On plaything.user_credentials TO 'dev1'@'%';
FLUSH PRIVILEGES

이런 식으로 계정에 특정 db의 테이블에 대해서 권한을 설정할 수 있다.
그런데 그냥 접속이 안돼서 보니까 테이블에 접속을 해야 했다.

mysql -h db주소 -u dev1 -p plaything

이렇게 해서 접속을 하면 밑에처럼 허용된 테이블만 보인다.

profile
답을 찾기 위해서 노력하는 사람

0개의 댓글