소개
전문적인 시스템 관리 환경에서 일상적인 애플리케이션 연결에 root 사용자를 사용하는 것은 큰 보안 위험입니다. 공격자가 root 계정을 사용하는 애플리케이션을 침해하면 서버의 모든 데이터베이스를 완전히 제어할 수 있습니다.
권장되는 방법은 모든 애플리케이션에 자체 전용 사용자를 할당하고, 해당 사용자의 권한을 자신의 전용 데이터베이스로만 제한하는 것입니다.
이는 운영 체제 수준에서 애플리케이션별 ID 를 분리하는 것과 같은 데이터베이스 방식입니다. 액세스 제어는 단순한 편의성이 아니라 사용 목적을 반영해야 합니다.
또한 Linux 사용자 관리에서 이미 살펴본 최소 권한 원칙을 데이터베이스에 적용한 것입니다. 애플리케이션 계정 하나가 침해되더라도 제한된 권한을 사용하면 피해 범위를 줄일 수 있습니다.
이 실습에서는 다음 표준 절차에 따라 환경을 보호합니다.
- 가상의 애플리케이션을 위한 새 데이터베이스를 생성합니다.
- 해당 애플리케이션 전용 사용자 계정을 생성합니다.
- 사용자에게 해당 데이터베이스에만 권한을 부여합니다.
- 새 사용자로 로그인하여 설정을 확인합니다.
새 데이터베이스 생성
먼저 새 데이터베이스를 생성하려면 관리 권한으로 MySQL 서버에 로그인해야 합니다.
터미널을 열고 다음 명령을 실행하여 MySQL 셸에 접속합니다.
sudo mysql
참고: 이 명령은 시스템 소켓을 통해 root 로 인증할 때
sudo명령을 사용합니다. 모르는 비밀번호를 입력하라는 메시지가 표시되면mysql -u root -p를 시도합니다.
mysql> 프롬프트가 표시되면 SQL 명령을 실행할 수 있습니다.
현재 데이터베이스 생성은 권한이 필요한 작업이므로 관리 권한이 있는 데이터베이스 사용자로 연결되어 있습니다. 일반적인 애플리케이션 계정에는 보통 이 수준의 제어 권한이 없습니다.
app_db라는 새 데이터베이스를 생성합니다. 이 데이터베이스는 애플리케이션 데이터의 저장 공간으로 사용됩니다.
CREATE DATABASE app_db;
성공하면 MySQL 은 Query OK를 반환합니다. 모든 데이터베이스를 나열하여 데이터베이스가 생성되었는지 확인할 수 있습니다.
SHOW DATABASES;
목록에 app_db가 표시되어야 합니다.
전용 사용자 생성
데이터베이스를 만들었으므로 이제 해당 데이터베이스를 관리할 사용자가 필요합니다. app_user라는 사용자를 생성합니다.
같은 MySQL 셸에서 다음 명령을 실행합니다.
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';
명령 구성 요소:
'app_user': 사용자 이름입니다.'@'localhost': 이 서버에서만 연결할 수 있도록 사용자를 제한합니다. 이는 보안 조치입니다.IDENTIFIED BY 'password': 비밀번호를password로 설정합니다.
이 시점에서 사용자는 생성되었지만 권한이 없습니다. 로그인할 수는 있지만 데이터를 읽거나 쓸 수는 없습니다.
이는 이해해야 할 중요한 보안 모델입니다. ID 와 권한은 서로 별개입니다. 계정을 생성해도 모든 데이터베이스 객체를 자동으로 사용할 수 있는 권한이 부여되지는 않습니다.
시스템 사용자 테이블을 확인하여 사용자가 생성되었는지 확인할 수 있습니다.
SELECT User, Host FROM mysql.user WHERE User = 'app_user';
권한 부여
이제 app_user에게 app_db를 사용할 권한을 명시적으로 부여해야 합니다.
사용자에게 app_db에 대한 ALL 권한, 즉 테이블 읽기, 쓰기 및 수정 권한을 부여합니다.
MySQL 셸에서 다음 명령을 실행합니다.
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';
구문 구성 요소:
GRANT ALL PRIVILEGES: 모든 액세스 권한을 부여합니다.ON app_db.*:app_db데이터베이스와 그 안의*(모든 테이블) 에 이 권한을 적용합니다.TO 'app_user'@'localhost': 이 권한을 받을 사용자를 지정합니다.
database.* 패턴은 권한 범위를 지정할 수 있으므로 중요합니다. MySQL/MariaDB에서는 전역, 데이터베이스별, 테이블별로 권한을 부여할 수 있으며, 경우에 따라 더 좁은 범위로도 지정할 수 있습니다.
이 설정을 통해 app_user는 app_db 안에서는 강력한 권한을 가지지만, 다른 곳에서는 아무 권한도 갖지 않습니다.
권한이 올바르게 할당되었는지 확인하려면 다음 명령을 실행합니다.
SHOW GRANTS FOR 'app_user'@'localhost';
사용자 액세스 확인
모든 설정이 예상대로 작동하는지 확인하기 위해 root 계정에서 로그아웃한 후 새 사용자로 로그인합니다.
먼저 root 세션을 종료합니다.
EXIT;
이제 Linux 터미널로 돌아와 app_user로 로그인합니다.
mysql -u app_user -p
비밀번호를 입력하라는 메시지가 표시되면 password를 입력합니다.
로그인한 후 사용자가 볼 수 있는 데이터베이스를 확인합니다.
SHOW DATABASES;
확인할 항목:
app_db와information_schema가 표시되어야 합니다.mysql과sys는 표시되지 않아야 합니다.
이를 통해 사용자에게 설정한 권한이 올바르게 작동하는지 확인할 수 있습니다. 사용자는 액세스가 허용된 항목만 볼 수 있습니다.
이 확인 단계는 액세스 제어에서 매우 중요합니다. GRANT 문을 실행하는 것만으로는 충분하지 않습니다. 실제 시스템에 표시되는 내용이 의도한 최소 권한 설계와 일치하는지 확인해야 합니다.
실습을 마치려면 사용할 데이터베이스로 전환합니다.
USE app_db;
EXIT;
요약
이 실습에서는 안전한 데이터베이스 액세스 모델을 성공적으로 구현했습니다. 다음 방법을 배웠습니다.
- 새 데이터베이스 (
app_db) 를 생성합니다. - 전용 사용자 (
app_user) 를 생성합니다. GRANT명령을 사용하여 필요한 권한을 부여합니다.- 액세스 제어가 의도한 대로 작동하는지 확인합니다.
이 "최소 권한" 모델은 데이터베이스 보안의 핵심이며, 배포하는 모든 애플리케이션에 적용해야 합니다.



