MySQL 비밀번호 관리 가이드: 비밀번호 설정, 변경, 재설정 및 보안 방법 (Windows, Linux, Mac)

目次

1. 소개

MySQL 비밀번호 관리의 중요성

MySQL은 전 세계에서 널리 사용되는 데이터베이스 관리 시스템입니다. 그러나 보안 관리의 기반올바른 비밀번호 설정 및 관리에 있습니다. 적절한 비밀번호 관리를 하지 않으면 다음과 같은 위험에 직면할 수 있습니다:

  • 무단 접근 : 약한 비밀번호는 시스템을 외부 공격에 취약하게 만듭니다.
  • 데이터 유출 : 민감한 정보가 악의적인 사용자에 의해 노출될 수 있습니다.
  • 시스템 변조 : 데이터 삭제 또는 수정이 웹사이트와 애플리케이션의 정상적인 운영에 영향을 줄 수 있습니다.

이러한 위험을 피하려면 강력한 비밀번호를 설정하고 정기적으로 변경하는 것이 필수적입니다. 이 문서에서는 MySQL 비밀번호 관리의 다음 측면을 자세히 설명합니다:

새 사용자에 대한 비밀번호 설정 방법
기존 사용자 비밀번호 변경 방법
잊어버린 비밀번호 재설정 방법
비밀번호 강도 확인 방법
일반적인 오류와 해결 방법
보안을 강화하기 위한 권장 설정

이 문서를 읽으면 MySQL 비밀번호를 올바르게 관리하는 데 필요한 지식과 기술을 습득하게 되니, 끝까지 꼭 읽어 보시기 바랍니다.

2. MySQL 비밀번호 설정 및 변경 방법

새 사용자 생성 및 비밀번호 설정

이 섹션에서는 MySQL에서 새 사용자를 생성하고 비밀번호를 설정하는 방법을 설명합니다.

1. MySQL에 로그인

먼저 MySQL 관리자(예: root 사용자)로 로그인합니다.

mysql -u root -p

-u rootroot 사용자로 로그인하기 위한 옵션이며, -p비밀번호 입력 프롬프트를 표시합니다.

2. 새 사용자 생성 및 비밀번호 설정

CREATE USER 명령을 사용하여 새 사용자를 만들고 비밀번호를 설정합니다.

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'secure_password';
  • 'newuser'@'localhost' : 사용자 이름(newuser)과 사용자가 연결할 수 있는 호스트(localhost)를 지정합니다.
  • 'secure_password' : 설정할 비밀번호(강력한 비밀번호를 사용하세요).

3. 적절한 권한 부여

새 사용자에게 데이터베이스 권한을 부여해야 합니다. 예를 들어 모든 권한을 부여하려면 다음과 같이 합니다.

GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
  • ALL PRIVILEGES : 모든 권한을 부여합니다.
  • *.* : 모든 데이터베이스와 테이블에 대한 접근을 허용합니다.
  • WITH GRANT OPTION : 사용자가 다른 사용자에게 권한을 부여할 수 있도록 합니다.

4. 권한 적용

FLUSH PRIVILEGES를 실행하여 변경 사항을 적용합니다.

FLUSH PRIVILEGES;

이제 보안 비밀번호와 적절한 권한을 가진 새 사용자를 성공적으로 생성했습니다.

기존 사용자 비밀번호 변경

이 섹션에서는 기존 MySQL 사용자의 비밀번호를 변경하는 방법을 설명합니다.

1. MySQL에 로그인

관리자 권한으로 로그인합니다.

mysql -u root -p

2. ALTER USER 사용하여 비밀번호 변경 (MySQL 5.7 이상)

ALTER USER 'existinguser'@'localhost' IDENTIFIED BY 'new_secure_password';
  • 'existinguser'@'localhost' : 수정할 사용자 이름과 호스트.
  • 'new_secure_password' : 새 비밀번호.

3. SET PASSWORD 사용하여 비밀번호 변경 (MySQL 5.6 이하)

SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('new_secure_password');

PASSWORD() 함수를 사용하면 비밀번호가 저장되기 전에 올바르게 암호화됩니다.

4. 변경 사항 적용

FLUSH PRIVILEGES; 실행을 잊지 마세요.

FLUSH PRIVILEGES;

이 방법을 사용하면 기존 사용자의 비밀번호를 안전하게 변경할 수 있습니다.

3. MySQL 비밀번호를 잊어버렸을 때 재설정 방법

비밀번호를 잊어버렸더라도 올바른 절차를 따르면 재설정할 수 있습니다. 이 섹션에서는 Windows, Linux, Mac에서 비밀번호를 재설정하는 방법을 설명합니다.

Windows에서 MySQL 비밀번호 재설정 방법

Windows에서 MySQL 루트 비밀번호를 재설정하는 일반적인 방법은 skip-grant-tables 옵션을 사용하는 것입니다.

1. MySQL 서비스 중지

먼저, Windows에서 실행 중인 MySQL 서비스를 중지합니다.

net stop mysql

또는 services.msc를 열어 수동으로 MySQL 서비스를 중지할 수 있습니다.

2. mysqld --skip-grant-tables 사용하여 MySQL 시작

mysqld --skip-grant-tables --skip-networking

3. MySQL에 로그인

mysql -u root

4. 새 비밀번호 설정

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

또는 MySQL 5.6 및 이전 버전에서는 SET PASSWORD를 사용합니다.

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');

5. MySQL 재시작

net stop mysql
net start mysql

Linux / Mac에서 MySQL 비밀번호 재설정 방법

1. MySQL 서비스 중지

sudo systemctl stop mysql

2. --skip-grant-tables 모드로 MySQL 시작

sudo mysqld_safe --skip-grant-tables --skip-networking &

3. MySQL에 로그인

mysql -u root

4. 비밀번호 재설정

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

5. MySQL 재시작

sudo systemctl start mysql

MySQL 8.0 이상에서 비밀번호 재설정 방법의 변경 사항

MySQL 8.0에서는 비밀번호 관리 메커니즘이 변경되었으므로 다음 사항을 유의해야 합니다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';

필요할 때 레거시 비밀번호 인증 방법을 계속 사용할 수 있습니다.

4. MySQL 비밀번호 변경 시 흔히 발생하는 오류 해결

MySQL 비밀번호를 변경하려고 할 때 오류가 발생할 수 있습니다. 이 섹션에서는 일반적인 오류의 원인과 해결책을 설명합니다.

ERROR 1045 (28000): 사용자 접근 거부

오류 원인

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

이 오류는 MySQL에 로그인할 때 비밀번호가 틀렸거나 권한이 충분하지 않은 경우 발생합니다.

해결 방법

  1. 입력한 비밀번호를 다시 확인
  2. 올바른 사용자 이름과 호스트 지정
    SELECT User, Host FROM mysql.user;
    
  1. 비밀번호 재설정 (비밀번호 재설정 섹션 참조)
  2. 권한을 올바르게 구성
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

ERROR 1133: 사용자 테이블에서 일치하는 행을 찾을 수 없음

오류 원인

ERROR 1133: Can't find any matching row in the user table

이 오류는 지정한 사용자가 존재하지 않을 때 발생합니다.

해결 방법

  1. 현재 사용자 목록 확인
    SELECT User, Host FROM mysql.user;
    
  1. 사용자 재생성
    CREATE USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
    
  1. 올바른 호스트 지정 (localhost 또는 %를 적절히 사용)

ERROR 1820: 비밀번호를 재설정해야 함

오류 원인

ERROR 1820: You must reset your password using ALTER USER statement before executing this statement.

이 오류는 비밀번호가 만료된 경우 발생합니다.

해결 방법

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

비밀번호 만료를 비활성화하려면:

SET GLOBAL default_password_lifetime = 0;

ERROR 2059: 플러그인 caching_sha2_password를 로드할 수 없음

오류 원인

ERROR 2059: Plugin caching_sha2_password could not be loaded

MySQL 8.0 이상에서는 기본 인증 플러그인이 caching_sha2_password로 변경되어 일부 클라이언트에서 오류가 발생할 수 있습니다.

해결 방법

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';

또는 MySQL 설정 파일(my.cnf 또는 my.ini)에 다음을 추가하고 MySQL을 재시작하십시오.

[mysqld]
default_authentication_plugin=mysql_native_password

MySQL 재시작:

sudo systemctl restart mysql

5. MySQL 보안 강화 및 권장 설정

MySQL 보안을 강화하는 것은 데이터베이스 안전성을 높이고 무단 접근 및 데이터 유출을 방지하는 데 필수적입니다. 이 섹션에서는 MySQL 보안을 향상시키기 위한 권장 구성을 소개합니다.

강력한 비밀번호 설정

MySQL에서 약한 비밀번호를 사용하면 시스템이 공격자에게 쉽게 노출됩니다. 비밀번호 강도를 높이는 설정을 구성하십시오.

비밀번호 정책 활성화

현재 비밀번호 정책을 확인하십시오:

SHOW VARIABLES LIKE 'validate_password%';

강력한 비밀번호 정책을 구성하십시오:

SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

비밀번호 만료 설정

정기적인 비밀번호 변경은 보안을 강화합니다.

현재 비밀번호 만료 설정을 확인하십시오:

SHOW VARIABLES LIKE 'default_password_lifetime';

비밀번호 만료를 90일로 설정하십시오:

SET GLOBAL default_password_lifetime = 90;

root 사용자 보안 강화

root 사용자의 원격 접근 제한

root 사용자의 현재 호스트 구성을 확인하십시오:

SELECT User, Host FROM mysql.user WHERE User = 'root';

root의 원격 접근을 비활성화하십시오:

UPDATE mysql.user SET Host='localhost' WHERE User='root';
FLUSH PRIVILEGES;

대체 관리자 계정 생성 및 root 비활성화

CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost';
FLUSH PRIVILEGES;

MySQL 원격 연결 제한

구성 파일(my.cnf 또는 my.ini)을 편집하십시오:

[mysqld]
bind-address = 127.0.0.1

Linux에서 방화벽을 구성하십시오:

sudo ufw deny 3306

특정 IP 주소만 허용하십시오:

sudo ufw allow from 192.168.1.100 to any port 3306

불필요한 계정 및 권한 제거

현재 사용자 목록을 확인하십시오:

SELECT User, Host FROM mysql.user;

익명 사용자를 제거하십시오:

DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

불필요한 테스트 데이터베이스를 제거하십시오:

DROP DATABASE test;
FLUSH PRIVILEGES;

MySQL 로깅 활성화

오류 로그를 활성화하십시오:

[mysqld]
log_error = /var/log/mysql/error.log

일반 쿼리 로그를 활성화하십시오:

general_log = 1
general_log_file = /var/log/mysql/general.log

MySQL 재시작:

sudo systemctl restart mysql

6. 자주 묻는 질문 (FAQ)

이 섹션에서는 MySQL 비밀번호 설정, 수정 및 재설정과 관련된 일반적인 질문과 해결책을 요약합니다.

Q1: 잊어버린 MySQL root 비밀번호를 복구하는 가장 쉬운 방법은 무엇인가요?

해결 방법

  1. MySQL 중지
    sudo systemctl stop mysql
    
  1. skip-grant-tables 모드로 MySQL 시작
    sudo mysqld_safe --skip-grant-tables --skip-networking &
    
  1. MySQL에 로그인
    mysql -u root
    
  1. 새 비밀번호 설정
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
    
  1. MySQL 재시작
    sudo systemctl restart mysql
    

Q2: “ERROR 1045 (28000): Access denied for user” 오류가 발생하면 어떻게 해야 하나요?

해결 방법

  1. 입력한 비밀번호 확인
    mysql -u root -p
    
  1. 사용자가 존재하는지 확인
    SELECT User, Host FROM mysql.user;
    
  1. 비밀번호 재설정 (이전 절차 참고)
  2. 적절한 권한 부여
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

Q3: 비밀번호를 변경할 때 MySQL 5.6과 8.0 사이에 차이가 있나요?

MySQL 5.6 및 이전 버전에서 비밀번호 변경

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');

MySQL 8.0 및 이후 버전에서 비밀번호 변경

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

MySQL 8.0에서는 caching_sha2_password가 기본 인증 방법이므로, 오래된 클라이언트는 다음과 같은 조정이 필요할 수 있습니다:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';

Q4: MySQL 비밀번호 정책을 어떻게 강화할 수 있나요?

강력한 비밀번호 정책 구성

SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

Q5: MySQL root 사용자를 비활성화해도 안전한가요?

해결책

  1. 관리자 계정 생성
    CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'secure_password';
    GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
    
  1. root 계정 비활성화
    RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost';
    FLUSH PRIVILEGES;
    

Q6: MySQL 비밀번호를 안전하게 관리할 수 있는 도구가 있나요?

해결책

  1. mysql_config_editor (공식 MySQL 도구)
    mysql_config_editor set --login-path=local --host=localhost --user=root --password
    

비밀번호를 직접 입력하지 않고도 로그인할 수 있게 해줍니다.

mysql --login-path=local
  1. 비밀번호 관리자 (Bitwarden, 1Password, KeePass 등)
  • 강력한 비밀번호를 생성하고 안전하게 저장하는 데 유용합니다.

Q7: MySQL 비밀번호 변경을 기록할 수 있나요?

해결책

General Query Log 활성화

[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log

MySQL 재시작:

sudo systemctl restart mysql

7. 결론

이 문서에서는 MySQL 비밀번호 관리의 기초부터 고급 기술까지 모든 것을 설명했습니다. 아래는 주요 포인트 요약과 MySQL 비밀번호를 올바르게 관리하기 위한 체크리스트입니다.

MySQL 비밀번호 관리 핵심 포인트

적절한 비밀번호 설정 및 관리는 보안의 기반
새 사용자를 만들 때 강력한 비밀번호 설정
비밀번호를 정기적으로 변경하고 만료 정책을 설정
비밀번호를 잊어버렸을 때 복구 절차 이해
비밀번호 변경 중 오류를 적절히 해결
보안 강화를 위해 원격 접근 및 root 사용자 관리를 최적화
비밀번호 관련 활동을 추적하기 위해 로깅 활성화

MySQL 비밀번호 관리 체크리스트

Checklist ItemStatus
Have you set a strong root password for MySQL?✅ / ❌
Do you use the CREATE USER command when creating new users?✅ / ❌
Have you enabled the validate_password plugin and configured a strong password policy?✅ / ❌
Do you regularly change passwords and set expiration policies?✅ / ❌
Have you disabled remote access for the root user?✅ / ❌
Have you removed unnecessary or anonymous accounts?✅ / ❌
Do you understand how to reset passwords using skip-grant-tables mode?✅ / ❌
Do you understand how to resolve ERROR 1045 and ERROR 1820 during password changes?✅ / ❌
Have you enabled MySQL logs (general_log and error_log)?✅ / ❌

이 문서를 읽은 후 권장 다음 단계

  1. 현재 비밀번호 정책을 검토하고 필요하면 강화
    SHOW VARIABLES LIKE 'validate_password%';
    SET GLOBAL validate_password.policy = STRONG;
    SET GLOBAL validate_password.length = 12;
    
  1. 불필요한 계정 삭제
    DELETE FROM mysql.user WHERE User='';
    DROP DATABASE test;
    FLUSH PRIVILEGES;
    
  1. root 사용자의 원격 접근 제한
    UPDATE mysql.user SET Host='localhost' WHERE User='root';
    FLUSH PRIVILEGES;
    
  1. 정기적인 비밀번호 만료 설정
    SET GLOBAL default_password_lifetime = 90;
    
  1. 모니터링을 위한 로깅 활성화
    [mysqld]
    log_error = /var/log/mysql/error.log
    general_log = 1
    general_log_file = /var/log/mysql/general.log
    

MySQL 재시작:

sudo systemctl restart mysql

추가 학습을 위한 관련 기사

📌 MySQL 사용자 권한 관리 상세 가이드
📌 MySQL 백업 및 복구 절차
📌 MySQL 데이터베이스 최적화 방법
📌 외부 인증(LDAP 또는 OAuth)으로 MySQL 구성

마무리 생각

MySQL 비밀번호 관리는 데이터베이스 보안을 보호하기 위한 필수 지식입니다.
이 가이드에서 다루는 관행을 적용하고 안전한 데이터베이스 관리를 보장하세요! 💪