데이터베이스를 배우기 위해 MySQL을 사용하고 있다.

처음에는 테이블에 데이터를 INSERT 명령어를 사용하여 하나씩 입력했다.


점점 불편함을 느껴 외부 파일에서 데이터를 읽어 테이블에 적재하는 방법이 쓰려 했다.

"LOAD DATA INFILE"명령으로 외부 파일을 읽어 올 때 뜬금 없는 오류가 발생했다.

1. "LOAD DATA INFILE" 시도할 때 "ERROR 13" 발생.

mysql> load data infile '/home/DB/sampbd/d2013_52.txt' into table student; ERROR 13 (HY000): Can't get stat of '/home/DB/sampbd/d2013_52.txt' (Errcode: 2)

2. 해결책 발견

읽어올 외부 파일의 권한을 777로 변경했으나 동일 문제 발생.

문제는 AppArmor[각주:1]("Application Armor")란 리눅스 보안모듈이 MySQL의 권한을 제한하고 있는 것이다.

2.1 [sudo aa-status] 사용하여 현재 AppArmor 정책 확인.

hyunmu@hyunmu:/etc/mysql$ sudo aa-status [sudo] password for hyunmu: apparmor module is loaded. 21 profiles are loaded. 21 profiles are in enforce mode. /sbin/dhclient /usr/bin/evince /usr/bin/evince-previewer /usr/bin/evince-previewer//sanitized_helper /usr/bin/evince-thumbnailer /usr/bin/evince-thumbnailer//sanitized_helper /usr/bin/evince//sanitized_helper /usr/lib/NetworkManager/nm-dhcp-client.action /usr/lib/connman/scripts/dhclient-script /usr/lib/cups/backend/cups-pdf /usr/lib/lightdm/lightdm-guest-session /usr/lib/lightdm/lightdm-guest-session//chromium /usr/lib/telepathy/mission-control-5 /usr/lib/telepathy/telepathy-* /usr/lib/telepathy/telepathy-*//pxgsettings /usr/lib/telepathy/telepathy-*//sanitized_helper /usr/lib/telepathy/telepathy-ofono /usr/sbin/cups-browsed /usr/sbin/cupsd /usr/sbin/mysqld /usr/sbin/tcpdump 0 profiles are in complain mode. 5 processes have profiles defined. 5 processes are in enforce mode. /sbin/dhclient (760) /usr/lib/telepathy/mission-control-5 (2864) /usr/sbin/cups-browsed (1066) /usr/sbin/cupsd (1904) /usr/sbin/mysqld (1080) 0 processes are in complain mode. 0 processes are unconfined but have a profile defined.

mysqld가 강제 모드에 포함되어 있어서 쓰기를 거부하는 것이다. 

AppArmor가 쓰기 / 액세스를 차단하면 항목이 / var / log / 에 기록된다. 

해야하는 일은 /etc/apparmor.d/usr.sbin.mysqld를 편집하고 / data / 및 / data / *를 아래와 같이 추가하는 것이다.

2.2 etc/apparmor.d/usr.sbin.mysqld를 편집

[수정 전]

/usr/sbin/mysqld { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/user-tmp> #include <abstractions/mysql> #include <abstractions/winbind> capability dac_override, capability sys_resource, capability setgid, capability setuid, network tcp, /etc/hosts.allow r, /etc/hosts.deny r, /etc/mysql/*.pem r, /etc/mysql/conf.d/ r, /etc/mysql/conf.d/* r, /etc/mysql/*.cnf r, /usr/lib/mysql/plugin/ r, /usr/lib/mysql/plugin/*.so* mr, /usr/sbin/mysqld mr, /usr/share/mysql/** r, /var/log/mysql.log rw, /var/log/mysql.err rw, /var/lib/mysql/ r, /var/lib/mysql/** rwk, /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid rw, /var/run/mysqld/mysqld.sock w, /run/mysqld/mysqld.pid rw, /run/mysqld/mysqld.sock w, /sys/devices/system/cpu/ r, # Site-specific additions and overrides. See local/README for details. #include <local/usr.sbin.mysqld> }


[수정 후]

/var/run/mysqld/mysqld.pid rw, /var/run/mysqld/mysqld.sock w, /run/mysqld/mysqld.pid rw, /run/mysqld/mysqld.sock w, **/home/hyunmu/DB/sampdb/ r, /home/hyunmu/DB/sampdb/* rw,** /sys/devices/system/cpu/ r, # Site-specific additions and overrides. See local/README for details. #include <local/usr.sbin.mysqld>

3. 정상동작 확인.

mysql> load data infile '/home/hyunmu/DB/sampdb/s2013_52.txt' into table student;

Query OK, 5 rows affected (0.05 sec)

Records: 5  Deleted: 0  Skipped: 0  Warnings: 0


MySQL 재실행 후 외부 파일 읽기가 정상동작하는 것을 확인하였다.

  1. [출처: 위키백과] AppArmor ("Application Armor")는 시스템 관리자가 프로그램 프로필 별로 프로그램의 역량을 제한할 수 있게 해주는 리눅스 커널 보안 모듈이다. 프로필들은 네트워크 액세스, raw 소켓 액세스 그리고 파일의 읽기, 쓰기, 실행 같은 능력을 허용할 수 있다. AppArmor는 강제적 접근 통제(MAC)를 제공함으로써 전통적인 유닉스 임의적 접근 통제(DAC) 모델을 지원한다. 이것은 리눅스 버전 2.6.36부터 포함되었으며, 개발은 2009년부터 캐노니컬 사에 의해 지원된다. [본문으로]
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

+ Recent posts

티스토리 툴바