Maria DB를 운영하며 보안을 위해 조치했던 사항에 대해 공유드립니다.
 

-1. 계정관리

1) 계정현황 파악 
select user, host from mysql.user order by user, host;
 
 
host - 해당 계정에 접속 허용된 client의 IP, %로 설정된 경우 => 모든 호스트에서 접속가능하므로 주의필요
조치 => update mysql.user set host='10.64.181.211' where user='TEST';
 
Password - Null 값의 경우 패스워드 없이 접속 가능하므로 패스워드 설정필요
조치 => update mysql.user set password=password('test') where user='TEST';
 
* 패스워드 복잡도 설정 또한 mysql의 plugin 설치로 지원가능하며
자세한 내용은 지난 글 참조
https://sarc.io/index.php/mariadb/802-maria
 
Select_priv,Inser_priv 등 권한 - mysql.user 테이블의 권한과 mysql.db 테이블의 권한은 상당한 차이가 있는데
user 테이블에서 권한을 허가하는 것은 전체 DB 스키마에 권한을 허가하는 것과 같음
따라서 특별한 경우가 아니면 기본값으로 'N'을 부여하고
mysql.db 테이블에 각각의 DB스키마에 대해 권한을 부여해야함
 
조치 예시 => mysql.user 에 select_priv 권한이 있는 test 계정에 대해 권한 회수
 
update mysql.user set selevt_priv='N' where user = 'test';
grant select on testdb.* to 'test'@'%';
(db스키마명.테이블명)
flush privileges;
 
* mysql.user 테이블의 컬럼 설명

   Select_priv   : select문을 수행할 수 있는 권한
   Insert_priv   : insert문을 수행할 수 있는 권한
   Update_priv   : update문을 수행할 수 있는 권한
   Delete_priv   : delete문을 수행할 수 있는 권한
   Create_priv   : create문을 수행하거나 테이블을 생성할 수 있는 권한
   Drop_priv     : drop문을 수행하거나 데이타베이스를 삭제할 수 있는 권한
   Reload_priv   : mysqladmin reload명령을 이용하여 접근정보를 다시 읽을 수 있는 권한
   Shutdown_priv : mysqladmin shutdown명령을 이용하여 서버를 종료시킬 수 있는 권한
   Process_priv  : 서버 프로세스를 관리할 수 있는 권한
   File_priv     : select into outfile과 load data infile과 같은 명령을 이용하여 파일에 읽고
                  쓸 수 있는 권한
   Grant_priv    : 자신의 권한을 남에게 부여할 수 있는 권한
   References_priv : 사용하지 않음
   Index_priv    : 인덱스를 만들거나 삭제할 수 있는 권한 
   Alter_priv    : alter table문을 수행할 수 있는 권한
 
 

-2. server audit

=> 누가 언제 DB에 어떤 쿼리를 수행했는지 모니터링하기 위한 기능
 
mysql> select * from mysql.plugin;
+-----------+------------------+
| name      | dl               |
+-----------+------------------+
| CONNECT   | ha_connect.so    |
| FEDERATED | ha_federatedx.so |
+-----------+------------------+
2 rows in set (0.00 sec)
 
mysql> install soname 'server_audit.so';
Query OK, 0 rows affected (0.02 sec)
 
mysql> select * from mysql.plugin;
+--------------+------------------+
| name         | dl               |
+--------------+------------------+
| CONNECT      | ha_connect.so    |
| FEDERATED    | ha_federatedx.so |
| SERVER_AUDIT | server_audit.so  |
+--------------+------------------+
3 rows in set (0.00 sec)
 
mysql> set global server_audit_logging=on;
Query OK, 0 rows affected (0.00 sec)
 
* 아래 설정값으로 audit on/off 및 대상 쿼리유형 설정가능
예시)
server_audit_logging=ON
server_audit_events=QUERY_DDL
 
 
 
[masvc01]/data001/masvc01/TEST] pwd
/data001/masvc01/TEST
[ip-172-31-8-190:masvc01]/data001/masvc01/TEST] cat server_audit.log

20180422 15:50:02,ip-111-11-1-111,root,localhost,29,93,QUERY,mysql,'set global server_audit_logging=on',0
20180422 15:50:04,ip-111-11-1-111,root,localhost,29,94,QUERY,mysql,'show variables like \'%server%\'',0
20180422 15:50:23,ip-111-11-1-111,root,localhost,29,95,CREATE,legsd,server_audit,
20180422 15:50:23,ip-111-11-1-111,root,localhost,29,95,QUERY,mysql,'create table legsd.server_audit (num int)',0
20180422 15:50:26,ip-111-11-1-111,root,localhost,29,0,DISCONNECT,,,0
=> 접속일자, 접속 host, 사용계정, 수행쿼리 로깅
 

 

-3. mysql_history 파일 관리

DB 오너 계정 home 혹은 MYSQL_HISTFILE 환경변수 위치에 생기는 파일로 DB에서 수행한 쿼리정보가 로깅됨
[masvc01]/home/masvc01] pwd
/home/masvc01
[masvc01]/home/masvc01] tail -f .mysql_history
show processlist;
kill '6';
select * from mysql.plugin;
install soname 'server_audit.so';
select * from mysql.plugin;
show variables like '%server%';
set global server_audit_logging=on;
show variables like '%server%';
create table legsd.server_audit (num int);
select 1 from dual;
 
조치 => MYSQL_HISTFILE=/dev/null 로 설정하여 mysql_history 파일이 남지 않도록 설정
 
[root@localhost ~]# cat /root/.bash_profile 
# .bash_profile 
# Get the aliases and functions 
if [ -f ~/.bashrc ]; then 
. ~/.bashrc 
fi 
# User specific environment and startup programs 
PATH=$PATH:$HOME/bin 
export PATH 
unset USERNAME 
export MYSQL_HISTFILE=/dev/null 
[root@localhost ~]# source /root/.bash_profile