Loading...
MySQL 9.5 Reference Manual 9.5의 8.1.1 Security Guidelines의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Internet에 연결된 컴퓨터에서 MySQL을 사용하는 사람은 누구나 가장 흔한 보안 실수를 피하기 위해 이 절을 읽어야 합니다.
보안에 대해 논의할 때는, 모든 유형의 가능한 공격(도청, 변경, 재생, 서비스 거부)에 대해 전체 서버 호스트(단순히 MySQL 서버만이 아님)를 완전히 보호하는 것을 고려해야 합니다. 여기에서는 가용성과 결함 허용의 모든 측면을 다루지는 않습니다.
MySQL은 사용자가 시도할 수 있는 모든 연결, 쿼리 및 기타 작업에 대해 Access Control Lists (ACLs)에 기반한 보안을 사용합니다. 또한 MySQL 클라이언트와 서버 간의 SSL 암호화 연결도 지원합니다.
여기에서 논의되는 개념 중 많은 부분은 MySQL에만 국한되지 않으며, 대부분의 애플리케이션에 동일하게 적용되는 일반적인 아이디어입니다.
MySQL을 실행할 때 다음 지침을 따르십시오:
어떠한 경우에도 누구에게도 (MySQL root account를 제외하고는) mysql system database의 user table에 대한 access를 주지 마십시오!
이는 매우 중요합니다.
MySQL 액세스 권한 시스템이 어떻게 동작하는지 배우십시오
(Section 8.2, “Access Control and Account Management” 참고).
GRANT 및
REVOKE statement를 사용하여
MySQL에 대한 access를 제어하십시오. 필요 이상의 권한을 부여하지 마십시오.
결코 모든 호스트에 권한을 부여하지 마십시오.
Checklist:
mysql -u root를 시도해 보십시오. 비밀번호를 요구받지 않고
서버에 성공적으로 연결할 수 있다면,
누구든지 MySQL root user로서 전체 권한을 가지고
MySQL 서버에 연결할 수 있다는 의미입니다!
MySQL 설치 설명서를 다시 검토하고,
특히 root password 설정에 대한 정보를
주의 깊게 살펴보십시오.
Section 2.9.4, “Securing the Initial MySQL Account”를
참조하십시오.
SHOW GRANTS
statement를 사용하여 어떤 account가 무엇에 access할 수 있는지 확인하십시오.
그런 다음 REVOKE
statement를 사용하여 필요하지 않은 권한을 제거하십시오.
데이터베이스에 평문 비밀번호를 저장하지 마십시오. 컴퓨터가
침해될 경우, 침입자는 전체 비밀번호 목록을 가져가 사용할 수 있습니다.
대신, SHA2()나
그 밖의 일방향 해싱 함수을 사용하고,
해시 값만 저장하십시오.
rainbow table을 사용한 비밀번호 복구를 방지하려면, 이러한 함수을 평문 비밀번호에 직접 사용하지 마십시오. 대신 salt로 사용할 문자열을 선택하고, hash(hash(password)+salt) 값을 사용하십시오.
모든 비밀번호가 알려진 비밀번호 목록을 사용하는 자동화된 크래킹 시도와, social media 게시물 같은 여러분에 대한 공개 정보를 사용하는 목표 지향적인 추측 공격에 노출된다고 가정하십시오. dictionary 단어, 고유명사, 스포츠 팀 이름, acronym, 널리 알려진 구절처럼 쉽게 크랙되거나 추측될 수 있는 항목으로 비밀번호를 구성하지 마십시오. 특히 그것들이 여러분과 관련이 있을 경우에는 더욱 그렇습니다. 대문자 사용, 숫자 치환 및 추가, 특수 문자 사용은 예측 가능한 방식으로 사용된다면 도움이 되지 않습니다. 또한 어디에서든 예제로 사용된 비밀번호나 그 변형(예를 들어 강력한 비밀번호의 예로 제시되었더라도)을 절대로 선택하지 마십시오.
대신, 가능한 한 길고 예측 불가능한 비밀번호를 선택하십시오. 이는 반드시 기억하고 재입력하기 어려운 무작위 문자 조합이어야 한다는 뜻은 아니지만, 예를 들어 비밀번호 관리자 소프트웨어가 그러한 비밀번호를 생성·자동 입력하고 안전하게 저장해 줄 수 있다면, 이 역시 좋은 접근 방식입니다. 여러 단어로 이루어진 passphrase는 만들기 쉽고, 기억하고 재입력하기도 쉬우며, 단일 수정 단어 또는 예측 가능한 문자 시퀀스로 이루어진 일반적인 사용자 선택 비밀번호보다 훨씬 안전합니다.
안전한 passphrase를 만들려면, 그 안에 포함된 단어와 기타 요소들이 알려진 구절이나 인용문이 아니어야 하며, 예측 가능한 순서를 이루지 않아야 하고, 가능하다면 서로 아무런 선행 관계가 없어야 합니다.
firewall에 투자하십시오. 이는 어떤 소프트웨어에서든 발생 가능한 exploit 유형의 최소 50%로부터 여러분을 보호합니다. MySQL을 firewall 뒤나 demilitarized zone (DMZ)에 두십시오.
Checklist:
nmap과 같은 도구를 사용하여 Internet에서 포트를
스캔해 보십시오. MySQL은 기본적으로 포트 3306을 사용합니다.
이 포트는 신뢰할 수 없는 호스트에서 접근할 수 없어야 합니다.
MySQL 포트가 열려 있는지 간단히 확인하려면,
MySQL 서버가 실행 중인 호스트의 호스트 이름 또는 IP address를
_server_host_로 하여
원격 머신에서 다음 명령을 시도해 보십시오:
1$> telnet server_host 3306
telnet이 멈추거나 연결이 거부되면, 해당 포트는 차단된 것이며, 이것이 바람직한 상태입니다. 만약 연결이 성립되고 몇 개의 깨진 문자(garbage character)가 보인다면, 포트가 열려 있는 것이며, 특별한 이유로 열어 두어야 하는 것이 아니라면 firewall 또는 router에서 해당 포트를 닫아야 합니다.
MySQL에 access하는 애플리케이션은 사용자가 입력한 어떠한 데이터도 신뢰해서는 안 되며, 적절한 방어적 프로그래밍 기법을 사용하여 작성되어야 합니다. Section 8.1.7, “Client Programming Security Guidelines”를 참조하십시오.
Internet을 통해 평문(암호화되지 않은) 데이터를 전송하지 마십시오. 이 정보는 그것을 가로채어 자신들의 목적으로 활용할 시간과 능력이 있는 모든 사람에게 노출됩니다. 대신 SSL 또는 SSH와 같은 암호화 프로토콜을 사용하십시오. MySQL은 내부 SSL 연결을 지원합니다. 또 다른 방법으로는 SSH 포트 포워딩을 사용하여 통신을 위한 암호화(및 압축) 터널을 만드는 것입니다.
tcpdump 및 strings utility 사용법을 익히십시오. 대부분의 경우 다음과 같은 명령을 실행하여 MySQL 데이터 스트림이 암호화되지 않았는지 확인할 수 있습니다:
1$> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
이는 Linux에서 동작하며, 다른 시스템에서도 약간의 수정만으로 동작해야 합니다.
주의
cleartext 데이터가 보이지 않는다고 해서 항상 정보가 실제로 암호화되었다는 의미는 아닙니다. 높은 수준의 보안이 필요한 경우에는 security expert와 상의하십시오.
8.1 General Security Issues
8.1.2 Keeping Passwords Secure