systemd 기반 시스템의 mysql에서 INTO OUTFILE을 저장할 때 출력 파일이 systemd에 의해 캡처됩니다. 이유는 무엇입니까?

systemd 기반 시스템의 mysql에서 INTO OUTFILE을 저장할 때 출력 파일이 systemd에 의해 캡처됩니다. 이유는 무엇입니까?

나는 정기적으로 mysql(실제로는 mariaDB) 데이터베이스에서 간단한 보고서를 실행합니다.

MariaDB [acts]> SELECT resolution, title FROM acts ORDER BY resolution INTO OUTFILE '/tmp/acts-titles.txt';

최근에 나는 systemd 버전 218-2를 사용하여 내 데이터베이스 서버를 Linux 3.19 기반 시스템으로 업그레이드했는데 출력 파일이 내가 예상한 대로 /tmp 디렉터리로 직접 이동하지 않고 대신 /tmp의 개인 systemd 폴더로 이동했다는 사실에 놀랐습니다. :

[root@www tmp]# pwd
/tmp/systemd-private-3589befe3ce34ca1a67ed5a83bc77b8b-mysqld.service-ylvzCn/tmp
[root@www tmp]# ls
acts-titles.txt
[root@www tmp]# ls -ld /tmp/systemd-private-3589befe3ce34ca1a67ed5a83bc77b8b-mysqld.service-ylvzCn/
drwx------ 3 root root 60 Mar 23 04:32 /tmp/systemd-private-3589befe3ce34ca1a67ed5a83bc77b8b-mysqld.service-ylvzCn/

이것이 비극은 아니지만 루트 사용자만이 이 디렉토리에 액세스할 수 있으므로 불편합니다. 따라서 mysql 관리자도 시스템에 대한 루트 액세스 권한을 가져야 하는데 이는 반드시 원하는 것은 아닙니다.

systemd가 이 파일을 가져오는 이유를 설명할 수 있는 사람이 있습니까? 이 동작을 피할 수 있는 방법이 있습니까?

답변1

/lib/systemd/system/mariadb.service에서 secure tmp 옵션을 편집하면 이 동작을 변경할 수 있습니다.

systemctl stop mariadb

다음으로 /lib/systemd/system/mariadb.service를 편집하고 PrivateTmp를 false로 변경합니다.

# Place temp files in a secure directory, not /tmp
PrivateTmp=false  # default is true

마침내:

systemctl daemon-reload
systemctl start mariadb

설명에서 언급했듯이 더 나은 해결책은 mariadb.service 파일을 변경하는 것이 아니라 다른 디렉터리를 선택하고 mariadb를 실행하는 사용자가 해당 디렉터리에 액세스할 수 있도록 권한을 부여하고 OUTFILE에서 해당 디렉터리를 가리킬 수 있도록 하는 것입니다.

PrivateTmp 옵션을 활성화하면 서비스가 보게 될 /tmp 디렉토리가 개인용이고 호스트 시스템 /tmp로부터 격리됩니다.
좋은 아이디어를 찾을 수 있을 거예요여기.

관련 정보