MySQL 데이터베이스를 운영하고 있다면 데이터베이스 보안을 유지하는 것이 얼마나 어려운 일인지 잘 알고 있을 것입니다. SQL 인젝션(SQL Injection)을 이용한 해킹 시도부터 무차별 대입 공격(Brute Force Attack)까지, 특히 원격으로 데이터베이스에 접근해 작업할 때는 데이터를 안전하게 지키기가 쉽지 않습니다.
SQL 서버가 원격 연결을 허용하도록 설정하는 방법은 여러 가지가 있지만, 주의가 필요합니다. MySQL 서버에서 원격 연결을 허용하면 데이터베이스가 해커에게 쉬운 표적이 될 수 있기 때문입니다. 안전하게 MySQL 데이터베이스에 원격 연결을 허용하려면 다음 내용을 반드시 숙지해야 합니다.
시작하기 전에
MySQL 데이터베이스를 변경하기 전에 반드시 데이터베이스를 백업해야 합니다. 특히 실제 서비스 중인 프로덕션 서버(운영 중인 서버)를 다루고 있다면 더욱 그렇습니다. 데이터베이스나 이를 호스팅하는 서버에 가한 변경 사항은 문제가 발생할 경우 심각한 데이터 손실로 이어질 수 있습니다.
또한 서버 연결 설정을 변경한 후에는 해당 서버에 접근하지 못하게 될 가능성도 있습니다. 이런 상황이 발생하면 서버 관리자의 도움을 받아야 할 수 있습니다. 따라서 원격 환경에 적용하기 전에 로컬에서 실행 중인 MySQL 서버로 변경 사항을 먼저 시험해 보는 것이 좋습니다.
원격 서버를 수정하려면 안전한 접속 방법도 필요합니다. SSH(Secure Shell)가 가장 좋은 방법입니다. SSH를 사용하면 원격 서버에 연결할 수 있으며, 라즈베리 파이(Raspberry Pi)처럼 로컬 네트워크에 있는 서버에도 연결할 수 있습니다.
이 가이드는 MySQL이 원격 연결을 허용하도록 설정하는 단계를 안내합니다. 시작하기 전에 MySQL이 설치된 서버에 직접 또는 원격으로 접근할 수 있어야 합니다.
예를 들어 SSH를 통한 원격 접근 권한이 없다면, root MySQL 계정이 이미 원격 연결을 허용하고 있지 않는 한 MySQL 데이터베이스가 원격 연결을 허용하도록 직접 설정할 수 없습니다. 따라서 진행하기 전에 먼저 해당 연결을 확립해야 합니다.
MySQL 설정 파일 편집하기
MySQL이 원격 연결을 허용하도록 설정하는 첫 번째 단계는 MySQL 설정 파일을 편집하는 것입니다. 이 단계에서는 이미 MySQL 데이터베이스가 호스팅되는 서버, PC 또는 Mac에 원격으로 연결하여 콘솔에 접근할 수 있다고 가정합니다.
또는 Mac이나 Linux에서 열려 있는 터미널을 사용하거나, Windows에서 텍스트 편집기를 사용해 로컬 MySQL 서버를 설정할 수도 있습니다.
- 먼저 선호하는 콘솔 텍스트 편집기로 MySQL 설정 파일을 엽니다. Linux에서는 터미널이나 SSH 창에 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf를 입력해 nano 편집기로 파일을 편집합니다(MySQL이 기본 경로에 설치된 경우 기준).
- Windows를 사용 중이라면 파일 탐색기를 열어 MySQL이 설치된 폴더(예: C:/Program Files/MySQL/MySQL Server 8.0)로 이동합니다. my.ini 파일을 더블클릭해 기본 텍스트 편집기(예: 메모장)로 엽니다. 파일이 없다면 새로 만들어야 합니다.
- Mac에서는 터미널 창을 열고 sudo nano /usr/local/etc/my.cnf를 입력합니다. Homebrew로 MySQL을 설치했다면 이것이 기본 설정 파일입니다.
위에 언급된 위치는 MySQL 설정 파일의 기본 경로입니다. 명령이 작동하지 않으면 관련 파일(my.cnf, mysqld.cnf, my.ini)을 직접 검색해 올바른 파일 경로를 찾아야 합니다.
안전한 Bind-Address IP 범위 설정하기
- 서버의 MySQL 설정 파일을 열었다면 키보드 방향키를 사용해 파일의 bind-address 섹션으로 이동합니다. 이 IP 범위는 데이터베이스로의 연결을 제한하며, 일반적으로 127.0.0.1로 설정되어 로컬 컴퓨터나 서버에서만 연결할 수 있게 되어 있습니다.
- 현재 인터넷 연결을 사용하는 장치들의 연결을 허용하도록 MySQL 데이터베이스를 구성하려면 먼저 자신의 공인(public) IP 주소를 확인한 후, 127.0.0.1을 해당 IP 주소로 교체합니다. 또는 연결을 허용하려는 특정 장치나 서버의 IP 주소로 교체할 수도 있습니다.
- 경우에 따라 모든 원격 연결을 허용하고 싶을 수도 있습니다. 하지만 이는 매우 위험하므로 프로덕션 서버에서는 절대 사용해서는 안 됩니다. 그래도 설정하려면 127.0.0.1을 0.0.0.0으로 교체하면 됩니다.
- Basic Settings 섹션의 port 값을 확인해 둡니다. 다음 섹션에서 필요합니다. 값이 보이지 않으면 기본값인 3306 포트가 사용됩니다. 새 줄에 port = xxxx를 입력하고 xxxx를 적절한 포트 값으로 바꾸면 직접 포트를 지정할 수도 있습니다.
- MySQL 설정 파일의 bind-address 구성을 마쳤으면 파일을 저장합니다. Linux에서는 Ctrl + O, Ctrl + X를 누르고, Mac에서는 Command + O, Command + X를 누릅니다. Windows 사용자는 파일 > 저장을 선택하면 됩니다.
- 다음으로 Linux와 Mac 사용자는 mysql.server stop && mysql.server start 또는 mysql.server restart를 입력해 MySQL을 재시작할 수 있습니다. sudo로 권한을 승격해야 할 수도 있으며(예: sudo mysql.server restart), mysql.server 파일의 적절한 경로(예: /usr/local/bin/mysql.server)를 사용해야 할 수도 있습니다.
- 위 명령이 작동하지 않으면 대신 sudo service mysql restart를 시도해 보세요.
- Windows에서 MySQL을 재시작하려면 시작 메뉴를 마우스 오른쪽 버튼으로 클릭하고 Windows PowerShell(관리자)을 선택해 새 PowerShell 창을 엽니다. PowerShell 창에서 net stop mysql80을 입력한 후 net start mysql80을 입력합니다. 이때 mysql80은 PC에 맞는 올바른 서비스 이름으로 교체해야 합니다.
Windows에서 올바른 서비스 이름을 모르겠다면 net start를 입력해 확인할 수 있습니다. 설정을 다시 불러올 수 없다면 서버를 재시작하고 필요하다면 MySQL을 수동으로 재시작하세요.
방화벽 구성하기
이 시점에서 MySQL 데이터베이스는 MySQL 설정 파일에서 bind-address 값으로 지정한 IP 주소를 사용하는 장치의 원격 연결을 허용해야 합니다(값을 0.0.0.0으로 설정했다면 모든 장치의 연결을 허용). 하지만 여전히 장치 또는 네트워크 방화벽이 연결을 차단할 수 있습니다.
대부분의 서버와 PC는 특정 포트에 대한 접근이 허용되지 않으면 연결을 차단하는 방화벽을 사용합니다. 설정 방법은 Windows에서 MySQL을 실행하는지 Linux에서 실행하는지에 따라 달라집니다. Mac 방화벽은 기본적으로 비활성화되어 있으므로 추가 작업이 필요 없습니다.
Linux 방화벽 구성하기
많은 Linux 서버가 기본 방화벽 유틸리티로 iptables를 사용합니다. 아래 단계에 따라 구성할 수 있습니다.
- 터미널 또는 SSH 연결을 열고 sudo iptables -A INPUT -p tcp -s X.X.X.X --dport YYYY -j ACCEPT를 입력합니다. X.X.X.X는 MySQL 연결을 허용하려는 장치의 IP 주소로, YYYY는 MySQL 설정 파일의 포트 값(예: 3306)으로 교체합니다.
- 이렇게 하면 방화벽이 임시로 구성됩니다. Debian 또는 Ubuntu 기반 Linux 서버를 사용한다면 터미널이나 SSH 창에 sudo netfilter-persistent save와 sudo netfilter-persistent reload를 입력해 변경 사항을 영구적으로 저장하세요.
iptables가 사용 중인 Linux 배포판의 기본 방화벽 도구가 아니라면 해당 배포판의 사용자 매뉴얼을 참조해야 합니다. netfilter-persistent 같은 패키지가 없다면 배포판의 소프트웨어 저장소 도구로 설치하세요(예: sudo apt install netfilter-persistent).
Windows 방화벽 구성하기
Windows PC나 서버로 데이터베이스를 호스팅하는 경우 다음 단계에 따라 방화벽을 구성할 수 있습니다.
- 시작 메뉴를 마우스 오른쪽 버튼으로 클릭하고 실행(Run)을 선택합니다.
- 실행 창에 wf.msc를 입력하고 확인을 선택합니다.
- Windows Defender 창에서 인바운드 규칙(Inbound Rules) > 새 규칙(New Rule)을 선택합니다.
- 새 인바운드 규칙 마법사(New Inbound Rule Wizard) 창에서 포트(Port) > 다음을 선택합니다.
- 다음 메뉴에서 옵션 중 TCP를 선택하고, MySQL 설정 파일에 명시된 포트 값(예: 3306)을 입력한 후 다음을 선택합니다.
- 동작(Action) 메뉴에서 기본 옵션인 연결 허용(Allow the connection)이 활성화된 상태로 두고 다음을 선택합니다.
- 규칙을 모든 네트워크 유형에 적용할 것인지 확인한 후 다음을 선택합니다.
- 제공된 입력란에 규칙을 알아볼 수 있는 이름(예: MySQL)을 입력하고 마침(Finish)을 선택해 방화벽 규칙 목록에 추가합니다.
연결에 문제가 있다면 위 단계를 반복하면서 동일한 세부 정보(포트 3306 등)로 방화벽 설정에 새 아웃바운드 규칙(outbound rule)을 만들어야 할 수 있습니다. 또한 데이터베이스로 들어오고 나가는 연결을 허용하도록 로컬 네트워크 라우터에서 차단된 필수 포트를 열어야 할 수도 있습니다.
MySQL로 원격 서버에 연결하기
MySQL 데이터베이스가 원격 연결을 허용하도록 구성한 후에는 실제로 연결을 설정해야 합니다. 터미널 또는 PowerShell 창에서 mysql 명령(Windows에서는 mysql.exe)을 사용하면 됩니다.
Windows를 사용 중이라면 시작하기 전에 로컬에 MySQL이 설치되어 있어야 합니다. Mac 사용자는 터미널에서 Homebrew로 MySQL을 설치할 수 있고(brew install mysql), Linux 사용자는 로컬 앱 저장소를 이용해 필요한 패키지를 설치할 수 있습니다(예: sudo apt install mysql).
Linux 또는 Mac에서 MySQL 연결하기
- Mac이나 Linux에서 원격 MySQL 서버에 연결하려면 새 터미널 창을 열고 mysql -u username -h X.X.X.X:XXXX -p를 입력합니다. X.X.X.X:XXXX는 원격 서버의 IP 주소와 포트 번호(예: 100.200.100.200:3306)로, username은 본인의 MySQL 사용자 이름으로 교체합니다.
- 메시지가 표시되면 비밀번호를 입력합니다. 연결에 성공하면 터미널에 성공 메시지가 나타납니다.
Windows에서 MySQL 연결하기
- Windows에서 원격 MySQL 서버에 연결하려면 시작 메뉴를 마우스 오른쪽 버튼으로 클릭하고 Windows PowerShell(관리자)을 선택해 새 PowerShell 창을 엽니다.
- 새 PowerShell 창에서 cd "C:\Program Files\MySQL\MySQL Workbench 8.0\"를 입력해 올바른 폴더로 이동합니다. 이 디렉터리는 PC의 실제 설치 디렉터리로 교체해야 합니다. 예를 들어 MySQL 버전이 8.0.1이라면 MySQL Workbench 8.0.1 폴더를 사용합니다.
- 그런 다음 .\mysql.exe -u username -h X.X.X.X:XXXX -p를 입력합니다. X.X.X.X:XXXX는 원격 서버의 IP 주소와 포트 번호(예: 100.200.100.200:3306)로, username은 원격 접근이 허용된 MySQL 사용자 이름(예: root)으로 교체합니다. 화면의 추가 지침을 따르세요.
- 메시지가 표시되면 비밀번호를 입력해 로그인 과정을 완료하고 원격으로 MySQL 데이터베이스에 접속합니다.
연결이 되지 않는다면 SSH를 사용해 MySQL 서버를 호스팅하는 서버나 PC에 접속하거나(또는 직접 접근하고) -h localhost 인수를 사용해 위 단계를 수행하세요. 그런 다음 아래 단계에 따라 적절한 사용자 계정을 만들 수 있습니다.
MySQL 데이터베이스에 원격 사용자 접근 허용하기
여기까지 왔다면 이제 서버의 root 사용자 계정이나 높은 권한을 가진 다른 사용자 계정으로 MySQL 서버에 원격 접속할 수 있을 것입니다. 하지만 이 정도의 접근 권한은 안전하지 않으므로, MySQL 데이터베이스에 접근하기 위해 더 제한적인 계정을 만드는 것이 좋습니다.
이 계정은 MySQL 서버에 대한 접근이 제한되어 선택된 데이터베이스만 다룰 수 있습니다. 다른 데이터베이스 데이터에 접근하거나 새 사용자 계정을 만드는 등의 중요한 변경은 할 수 없습니다.
MySQL 서버에 원격으로 로그인할 수 있어야 합니다. root 계정을 원격으로 사용할 수 없다면 원격 SSH 연결을 통해, 또는 서버를 호스팅하는 PC나 서버에 직접 접근해 mysql 명령으로 서버 셸(shell)에 접속해야 합니다.
- 원격 MySQL 셸(mysql 도구 사용)에서 CREATE USER "username"@"x.x.x.x" IDENTIFIED BY "password";를 입력하고 Enter를 누릅니다. username은 생성하려는 사용자 이름으로, x.x.x.x는 접속을 허용할 IP 주소로, password는 적절한 비밀번호로 교체합니다.
- 새 계정에 필요한 권한을 부여해야 합니다. 이를 위해 GRANT ALL ON databasename.* TO username@"x.x.x.x";를 입력하고 databasename, username, x.x.x.x를 올바른 값으로 교체합니다. 원한다면 databasename을 *로 바꿔 모든 데이터베이스에 대한 접근 권한을 부여할 수도 있습니다.
권한이 부여되면 위 섹션의 단계에 따라 새 계정으로 서버에 원격 접속할 수 있습니다(예: mysql -u username -h X.X.X.X:XXXX -p).
데이터베이스 데이터 보안 유지하기
MySQL이든 다른 종류의 SQL 데이터베이스든 데이터 보안을 유지하려면 연결을 안전하게 관리하는 것이 중요합니다. 좋은 방법 중 하나는 추측하기 쉬운 구식 비밀번호에 의존하는 대신, 서버 원격 접근용 SSH 키를 생성하는 것입니다.
데이터 손실이 걱정된다면 데이터베이스를 온라인으로 쉽게 백업할 수 있습니다. 대부분의 데이터베이스는 Linux 서버에서 운영되므로 Linux 파일 백업을 쉽게 자동화할 수 있습니다. Windows에서 MySQL을 실행 중이라면 유사한 자동 백업 시스템을 Windows에도 구축할 수 있어, 비상 상황에 데이터를 복구할 수 있습니다.