웹사이트 검색

12가지 Linux용 MySQL/MariaDB 보안 모범 사례


MySQL은 세계에서 가장 인기 있는 오픈 소스 데이터베이스 시스템이고 MariaDB(MySQL의 포크)는 세계에서 가장 빠르게 성장하는 오픈 소스 데이터베이스 시스템입니다. MySQL 서버를 설치한 후에는 기본 구성이 불안정하므로 보안은 일반적인 데이터베이스 관리에 있어 필수적인 작업 중 하나입니다.

추가 읽기: 초보자를 위한 MySQL/MariaDB 학습 - 1부

공격자는 항상 시스템의 모든 부분에서 취약점을 검사하고 과거에는 데이터베이스가 주요 목표 영역이었기 때문에 이는 전반적인 Linux 서버 보안을 강화하고 강화하는 데 기여할 것입니다. 일반적인 예는 MySQL 데이터베이스의 루트 비밀번호에 대한 무차별 공격입니다.

이 가이드에서는 Linux에 유용한 MySQL/MariaDB 보안 모범 사례를 설명합니다.

1. 안전한 MySQL 설치

이는 데이터베이스 서버 보안을 위해 MySQL 서버 설치 후 첫 번째 권장 단계입니다. 이 스크립트는 다음을 요청하여 MySQL 서버의 보안을 향상시킵니다.

  • 설치 중에 설정하지 않은 경우 루트 계정의 비밀번호를 설정하십시오.
  • 로컬 호스트 외부에서 액세스할 수 있는 루트 계정을 제거하여 원격 루트 사용자 로그인을 비활성화합니다.
  • 익명 사용자 계정을 제거하고 기본적으로 모든 사용자, 심지어 익명 사용자가 액세스할 수 있는 테스트 데이터베이스를 제거합니다.
mysql_secure_installation

실행 후 루트 비밀번호를 설정하고 [예/Y]를 입력하고 [Enter]를 눌러 일련의 질문에 답합니다.

2. 데이터베이스 서버를 루프백 주소에 바인딩

이 구성은 원격 시스템의 액세스를 제한하며 MySQL 서버에 로컬 호스트 내의 연결만 허용하도록 지시합니다. 기본 구성 파일에서 설정할 수 있습니다.

vi /etc/my.cnf	                   [RHEL/CentOS]	
vi /etc/mysql/my.conf                    [Debian/Ubuntu] 
OR
vi /etc/mysql/mysql.conf.d/mysqld.cnf    [Debian/Ubuntu] 

[mysqld] 섹션 아래에 다음 줄을 추가합니다.

bind-address = 127.0.0.1

3. MySQL에서 LOCAL INFILE을 비활성화합니다.

보안 강화의 일환으로 [mysqld] 섹션 아래의 다음 지시문을 사용하여 MySQL 내에서 기본 파일 시스템에 대한 액세스를 방지하려면 local_infile을 비활성화해야 합니다.

local-infile=0

4. MYSQL 기본 포트 변경

포트 변수는 TCP/IP 연결을 수신하는 데 사용되는 MySQL 포트 번호를 설정합니다. 기본 포트 번호는 3306이지만 표시된 대로 [mysqld] 섹션에서 변경할 수 있습니다.

Port=5000

5. MySQL 로깅 활성화

로그는 서버에서 어떤 일이 일어나는지 이해하는 가장 좋은 방법 중 하나입니다. 공격이 발생할 경우 로그 파일에서 침입 관련 활동을 쉽게 확인할 수 있습니다. [mysqld] 섹션 아래에 다음 변수를 추가하여 MySQL 로깅을 활성화할 수 있습니다.

log=/var/log/mysql.log

6. MySQL 파일에 대한 적절한 권한 설정

모든 mysql 서버 파일 및 데이터 디렉터리에 대해 적절한 권한이 설정되어 있는지 확인하십시오. /etc/my.conf 파일은 루트에만 쓸 수 있어야 합니다. 이는 다른 사용자가 데이터베이스 서버 구성을 변경하는 것을 차단합니다.

chmod 644 /etc/my.cnf

7. MySQL 쉘 기록 삭제

MySQL 쉘에서 실행하는 모든 명령은 mysql 클라이언트에 의해 기록 파일 ~/.mysql_history에 저장됩니다. 생성할 모든 사용자 계정에 대해 셸에 입력한 모든 사용자 이름과 비밀번호가 기록 파일에 기록되므로 이는 위험할 수 있습니다.

cat /dev/null > ~/.mysql_history

8. 명령줄에서 MySQL 명령을 실행하지 마세요

이미 알고 있듯이 터미널에 입력하는 모든 명령은 사용 중인 셸에 따라 기록 파일에 저장됩니다(예: bash의 경우 ~/.bash_history). 이 기록 파일에 접근하는 공격자는 기록된 모든 비밀번호를 쉽게 볼 수 있습니다.

다음과 같이 명령줄에 비밀번호를 입력하는 것은 권장되지 않습니다.

mysql -u root -ppassword_

명령 기록 파일의 마지막 부분을 확인하면 위에서 입력한 비밀번호를 볼 수 있습니다.

history 

MySQL을 연결하는 적절한 방법은 다음과 같습니다.

mysql -u root -p
Enter password:

9. 애플리케이션별 데이터베이스 사용자 정의

서버에서 실행되는 각 애플리케이션에 대해 해당 애플리케이션의 데이터베이스를 담당하는 사용자에게만 액세스 권한을 부여하십시오. 예를 들어 WordPress 사이트가 있는 경우 다음과 같이 WordPress 사이트 데이터베이스에 대한 특정 사용자를 만듭니다.

mysql -u root -p
MariaDB [(none)]> CREATE DATABASE osclass_db;
MariaDB [(none)]> CREATE USER 'osclassdmin'@'localhost' IDENTIFIED BY 'osclass@dmin%!2';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON osclass_db.* TO 'osclassdmin'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit

더 이상 서버의 응용 프로그램 데이터베이스를 관리하지 않는 사용자 계정을 항상 제거해야 합니다.

10. 추가 보안 플러그인 및 라이브러리 사용

MySQL에는 클라이언트가 mysql 서버에 연결하려는 시도를 인증하고, 비밀번호 유효성을 검사하고 민감한 정보에 대한 저장소를 보호하는 다양한 보안 플러그인이 포함되어 있으며 모두 무료 버전에서 사용할 수 있습니다.

자세한 내용은 여기에서 확인할 수 있습니다: https://dev.mysql.com/doc/refman/5.7/en/security-plugins.html

11. MySQL 비밀번호를 정기적으로 변경하세요

이는 정보/애플리케이션/시스템 보안 조언의 일반적인 부분입니다. 이 작업을 수행하는 빈도는 전적으로 내부 보안 정책에 따라 다릅니다. 그러나 장기간에 걸쳐 귀하의 활동을 추적해 온 "snoopers"가 귀하의 mysql 서버에 액세스하는 것을 방지할 수 있습니다.

MariaDB [(none)]> USE mysql;
MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere') WHERE User='root' AND Host = 'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

12. MySQL 서버 패키지를 정기적으로 업데이트

공급업체 저장소의 보안 업데이트 및 버그 수정 사항을 최신 상태로 유지하려면 mysql/mariadb 패키지를 정기적으로 업그레이드하는 것이 좋습니다. 일반적으로 기본 운영 체제 저장소의 패키지는 오래되었습니다.

yum update
apt update

mysql/mariadb 서버를 변경한 후에는 항상 서비스를 다시 시작하십시오.

systemctl restart mariadb		#RHEL/CentOS
systemctl restart mysql		#Debian/Ubuntu

추가 읽기: 15가지 유용한 MySQL/MariaDB 성능 조정 및 최적화 팁

그게 다야! 아래 의견 양식을 통해 귀하의 의견을 듣고 싶습니다. 위 목록에 누락된 MySQL/MariaDB 보안 팁이 있으면 공유해 주세요.