mariadb 10.4 이전에는 아래구문으로 일반 user도 테이블의 데이터를 FILE로 만들수 있게 업데이트가 가능했다.
update mysql.global_priv
SET File_priv = 'Y'
where user = 'xxxadm';
하지만 MariaDB 10.4/mysql 8.0 이상에서 실제 테이블이 아니고 view로 대체되어 바로 업데이트가 불가하다.
보안조치라고 하는데 상세 내용은 아래와 같다.
1) mysql에서 설명
다음 작업 및 서버 동작에 영향을 줍니다.
LOAD DATA 및 SELECT를 사용하여 서버 호스트에서 파일을 읽고 작성할 수 있습니다.
OUTFILE 문 과 LOAD_FILE() 함수로.
FILE 권한이 있는 사용자는 MySQL 서버에서 읽을 수 있거나 읽을 수 있는 서버 호스트의 모든 파일을 읽을 수 있습니다.
(이는 서버가 해당 파일에 액세스할 수 있기 때문에 사용자가 모든 데이터베이스 디렉터리에서 모든 파일을 읽을 수 있음을 의미합니다.)
MySQL 서버가 쓰기 액세스 권한이 있는 모든 디렉터리에서 새 파일을 만들 수 있습니다. 여기에는 권한 테이블을 구현하는 파일이 포함된 서버의 데이터 디렉터리가 포함됩니다.
테이블 만들기 문에 대한 또는 테이블 옵션을 사용할 수 있습니다.
DATA DIRECTORYINDEX DIRECTORY 보안 조치로 서버는 기존 파일을 덮어쓰지 않습니다. <-- update 안된다
* 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문을 수행할 수 있는 권한
https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html
2) MariaDB에서 설명
MariaDB 10.4 이후부터는 mysql.global_priv 테이블이 테이블을 대체했으며 이제 뷰(VIEW)가 됩니다.
MariaDB 10.4.13에서 전용 사용자는 뷰(VIEW)의 정의자로 만들어집니다. 이전에는 정의자였으며, 이 사용자 이름이 변경되었을 때 권한 문제가 발생했습니다.(MDEV-19650).mysql.usermysql.usermariadb.sysroot
3) 일반 user에게 outfile 권한 할당
MariaDB [mysql]> GRANT SELECT, FILE ON `mysql`.* TO 'xxxadm'@'%';
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
//mysql에 권한을 주려고 했는데 실패했다. 좀 더 확인해보니 아래와 같은 이유로 권한생성이 되지 않았다.
FILE 권한은 LOAD DATA INFILE 및 SELECT를 사용하여 서버 호스트에서 파일을 읽고 쓸 수 있는 권한을 제공합니다.
OUTFILE 문과 LOAD_FILE() 함수로. FILE 권한이 있는 사용자는 MySQL 서버에서 읽을 수 있거나 읽을 수 있는 서버 호스트의 모든 파일을 읽을 수 있습니다.
(이는 서버가 해당 파일에 액세스할 수 있기 때문에 사용자가 모든 데이터베이스 디렉터리에서 모든 파일을 읽을 수 있음을 의미합니다.)
따라서 FILE 권한은 전역 권한입니다. <-- 전역권한이다. 그렅다면 특정스키마만 별도로 할당할 수 없다는 얘기다.
서버의 모든 파일에 영향을 미치고 데이터베이스범위에 포함되지 않은 전역 명령(예: 등)에만 액세스할 수 있습니다.
FILE 권한을 부여하는 유일한 방법은 이 구문을 사용하여 모든 데이터베이스에 있습니다.
전역권한이라면 일반 user에 outfile 권한을 주는 것이기 때문에
tool이나 api로 접근할 수 있는 %는 보안상 문제가 있을 것으로 보인다.
localhost에서만 가능하도록 권한을 할당한다.
GRANT FILE ON *.* TO 'xxxadm'@'localhost';
flush privileges;
//확인
MariaDB [(none)]> SELECT Host, File_priv FROM mysql.user WHERE user = 'xxxadm' \G;
*************************** 1. row ***************************
Host: localhost
File_priv: Y
*************************** 2. row ***************************
Host: %
File_priv: N
2 rows in set (0.002 sec)
localhost에 file_priv권한이 Y 로 변경된 것을 확인할 수 있다.
4) 테스트
[admin@maria-db ~]$ mysql -uxxxadm -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 1478
Server version: 10.4.18-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use xxxDB;
Database changed
MariaDB [xxxDB]> select * from TMP_LOAD_20210604 limit 200 into outfile '/data/mariadb_tmp/TMP_LOAD_20210604.out';
Query OK, 200 rows affected, 1 warning (0.003 sec)
끝~
'RDB > mariadb' 카테고리의 다른 글
mariadb partition table(파티션 테이블)을 join 사용할 때는 성능 이슈에 주의해야 한다 (0) | 2023.06.27 |
---|---|
mariadb 10.4.17 upgrade 이후 장애 2 (0) | 2021.03.15 |
mariadb 10.4.17 upgrade 이후 장애 1 (0) | 2021.03.12 |
MariaDB 10.2 to 10.4 upgrade (0) | 2020.11.10 |
MariaDB 파티션 생성, 삭제, 추가 (0) | 2020.11.04 |