1. MySQL 설치 준비
1.1 SELinux 설정 (설치 전)
SELinux가 MySQL의 작업을 방해하지 않도록 설정합니다.
sudo semanage permissive -a mysqld_t
sudo restorecon -R /var/lib/mysql
- semanage permissive -a mysqld_t: MySQL 데몬(mysqld)에 대해 SELinux를 Permissive 모드로 설정합니다.
- restorecon -R /var/lib/mysql: MySQL 데이터 디렉토리의 SELinux 보안 컨텍스트를 복구합니다.
2. MySQL 설치
2.1 MySQL 리포지토리 추가
MySQL 설치를 위해 공식 리포지토리를 추가합니다.
sudo rpm -Uvh mysql80-community-release-el9-1.noarch.rpm
2.2 설치 가능한 MySQL 버전 확인
sudo yum --showduplicates list mysql-community-server
- 설치 가능한 MySQL 버전을 확인하여 최신 버전을 선택합니다.
2.3 MySQL 서버 설치
sudo yum install mysql-community-server
- 위 명령으로 MySQL 서버를 설치합니다.
3. MySQL 초기화 및 실행
3.1 데이터 디렉토리 권한 설정
MySQL 데이터 디렉토리(/var/lib/mysql)의 소유권과 권한을 설정합니다
sudo chown -R mysql:mysql /var/lib/mysql
sudo chmod 750 /var/lib/mysql
3.2 데이터 디렉토리 초기화
MySQL이 처음 실행될 때 필요한 시스템 파일과 데이터를 생성합니다.
sudo mysqld --initialize --user=mysql --datadir=/var/lib/mysql
- 이 명령은 auto.cnf와 같은 초기 파일을 생성하고, root 계정의 임시 비밀번호를 로그에 기록합니다.
3.3 MySQL 서비스 시작 및 활성화
MySQL 서비스를 시작하고, 컴퓨터 부팅 시 자동으로 실행되도록 설정합니다.
sudo systemctl enable --now mysqld
- enable은 부팅 시 자동 실행을 설정하고, --now는 즉시 서비스를 시작합니다.
- 상태 확인:
sudo systemctl status mysqld
4. root 계정의 임시 비밀번호 확인
4.1 로그에서 임시 비밀번호 확인
MySQL 초기화 시 생성된 root 계정의 임시 비밀번호는 로그 파일에 저장됩니다.
sudo grep 'temporary password' /var/log/mysqld.log
출력 예시:
[Note] A temporary password is generated for root@localhost: Abc123!xyz
- 위에서 확인된 임시 비밀번호(Abc123!xyz)를 메모해둡니다.
5. MySQL 로그인 및 비밀번호 변경
5.1 root 계정으로 로그인
임시 비밀번호를 사용하여 MySQL에 로그인합니다.
mysql -u root -p
- -u root: root 사용자로 로그인.
- -p: 비밀번호 입력을 요청.
- 프롬프트가 뜨면 로그에서 확인한 임시 비밀번호를 입력하세요.
5.2 새로운 비밀번호로 변경
로그인 후, root 계정의 비밀번호를 새롭게 설정해야 합니다.
ALTER USER 'root'@'localhost' IDENTIFIED BY '새로운비밀번호!';
6. (선택 사항) 인증 방식 변경
MySQL 8.0은 기본적으로 caching_sha2_password 인증 방식을 사용하지만, 일부 클라이언트와 호환되지 않을 수 있습니다. 이 경우 인증 방식을 mysql_native_password로 변경할 수 있습니다.
6.1 인증 방식 변경
로그인 후 아래 명령어를 실행하세요:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '새로운비밀번호!';
7. SELinux 복구 (보안 강화)
설치와 초기화가 완료되었으니 SELinux를 다시 Enforcing 모드로 복구합니다.
sudo semanage permissive -d mysqld_t
caching_sha2_password 인증 방식과 mysql_native_password와 차이점
caching_sha2_password 인증 방식
특징
- SHA-256 기반 암호화: 비밀번호를 안전하게 저장하기 위해 SHA-256 해시 알고리즘을 사용하며, 기존 SHA-1 기반의 mysql_native_password보다 보안성이 뛰어납니다.
- Salt 추가: 동일한 비밀번호라도 매번 다른 해시 값을 생성하도록 Salt(랜덤 데이터)를 사용하여 보안을 강화합니다.
- 서버 측 캐싱: 서버 메모리에 인증 데이터를 캐싱하여 동일 클라이언트의 재인증 시 성능을 향상시킵니다.
- 보안 연결 요구: 기본적으로 TLS/SSL과 같은 보안 연결을 통해 비밀번호를 전송하거나 RSA 키 교환 방식을 사용합니다.
주요 차이점 비교
특징 | caching_sha2_password | mysql_native_password |
도입 시기 | MySQL 8.0 | MySQL 4.1 |
암호화 알고리즘 | SHA-256 | SHA-1 |
보안 수준 | 높음 | 낮음 |
Salt 사용 여부 | 사용 (동일 비밀번호라도 다른 해시) | 미사용 (동일 비밀번호는 동일 해시) |
서버 측 캐싱 | 지원 | 미지원 |
TLS/SSL 요구 여부 | 권장 (또는 RSA 키 교환) | 필요 없음 |
클라이언트 호환성 | 최신 클라이언트만 지원 | 오래된 클라이언트와도 호환 |
sudo grep 'temporary password' /var/log/mysqld.log 로확인한 임시 비밀번호가 caching_sha2_password 방식인가?
MySQL에 로그인한 후, root 계정의 인증 플러그인을 확인할 수 있습니다:
SELECT user, host, plugin FROM mysql.user;
- 과거(특히 MySQL 5.6 이전)에는 root 계정의 초기 비밀번호가 없는 경우가 많았고, /var/log/mysqld.log 파일에 관련 정보가 기록되지 않았습니다.
- MySQL 5.7부터는 보안을 강화하기 위해 root 계정에 임시 비밀번호를 생성하고 이를 /var/log/mysqld.log에 기록하는 방식이 도입되었습니다.
- 현재(MySQL 8.0)도 동일한 방식으로 동작하며, 로그 파일에서 임시 비밀번호를 확인한 후 새로운 비밀번호로 변경해야 합니다.
특징MySQL 5.7 및 이전 (mysql_native_password)MySQL 8.0 (caching_sha2_password)
암호화 알고리즘 | SHA-1 | SHA-256 |
Salt 사용 여부 | 미사용 | 사용 (동일 비밀번호라도 다른 해시) |
보안 수준 | 낮음 | 높음 |
서버 측 캐싱 | 미지원 | 지원 |
TLS/SSL 요구 여부 | 필요 없음 | 권장 (또는 RSA 키 교환) |
로그에서 임시 비밀번호 확인 방식 | 동일 (/var/log/mysqld.log) | 동일 (/v |
실제 동작 차이
과거 (mysql_native_password):
- 비밀번호가 클라이언트에서 입력되면, 클라이언트는 이를 SHA-1 해시로 변환해 서버로 전송합니다.
- 서버는 저장된 해시값과 클라이언트에서 전송된 해시값을 비교하여 인증합니다.
- 동일한 비밀번호는 항상 동일한 해시값을 가지므로, 공격자가 해시값만으로도 비밀번호를 유추할 가능성이 있습니다.
현재 (caching_sha2_password):
- 비밀번호가 클라이언트에서 입력되면, 클라이언트는 이를 SHA-256 알고리즘과 Salt(랜덤 데이터)를 사용해 암호화합니다.
- 서버는 저장된 해시값과 클라이언트에서 전송된 값을 비교하여 인증합니다.
- Salt를 사용하기 때문에 동일한 비밀번호라도 매번 다른 해시값이 생성되며, 공격자가 사전 공격(Dictionary Attack)을 수행하기 어렵습니다.
왜 암호화 방식이 바뀌었나?
- SHA-1의 보안 취약점
- SHA-1은 오래된 알고리즘으로, 현재 많은 보안 연구자들이 이를 더 이상 안전하지 않다고 평가합니다.
- 예를 들어, Google과 CWI Amsterdam은 2017년에 SHA-1 충돌을 성공적으로 시연한 바 있습니다.
- SHA-256의 도입
- SHA-256은 SHA-1보다 훨씬 강력하며, 현재 보안 표준에서 널리 사용됩니다.
- MySQL 8.0은 이러한 최신 보안 표준을 따르기 위해 기본 인증 방식을 caching_sha2_password로 변경했습니다.
- Salt 적용
- Salt는 랜덤 데이터를 추가하여 동일한 비밀번호라도 매번 다른 해시값을 생성하도록 합니다.
- 이는 해시 충돌 공격이나 사전 공격(Dictionary Attack)을 방어하는 데 효과적입니다.
- 성능 향상
- caching_sha2_password는 서버 메모리에 인증 데이터를 캐싱하여 클라이언트가 재인증할 때 성능을 향상시킵니다.
기본 인증 방식을 변경하는 방법
MySQL 서버 전체의 기본 인증 방식을 변경하려면 설정 파일(my.cnf)을 수정해야 합니다.
[mysqld]
default_authentication_plugin=mysql_native_password
sudo systemctl restart mysqld
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '새로운비밀번호!';