6.1.1 보안 지침
인터넷에 연결된 컴퓨터에서 MySQL을 사용하는 모든 사용자는 보안과 관련된 가장 일반적인 실수를 피하기 위해이 절을 읽도록하십시오.
보안에 대해 고려할 때, 해당하는 모든 종류의 공격 (도청, 변경, 재생 및 서비스 거부)에서 (MySQL 서버뿐만 아니라) 서버 호스트 전체를 보호하는 것을 고려해야합니다. 여기에서는 가용성 및 내결함성의 모든 측면을 다루는 것은하지 않습니다.
MySQL은 사용자가 실행을 시도 할 수있는 모든 연결, 쿼리 및 기타 작업에 대한 액세스 제어 목록 (ACL)을 기반으로 보안이 사용되어 있습니다. 또한 MySQL 클라이언트와 서버간에 SSL을 지원하는 연결의 지원도 있습니다. 여기에서 설명되는 많은 개념은 MySQL 고유의 것이 아니라, 같은 일반적인 개념은 거의 모든 응용 프로그램에 해당합니다.
MySQL을 실행할 때 다음 지침을 따르십시오.
mysql
데이터베이스의user
테이블에 대한 액세스 권한을 (MySQLroot
계정 이외의) 모든 사용자에 절대적으로 부여하지 마십시오. 이것은 매우 중요합니다.MySQL 권한 시스템의 구조에 대해 학습합니다 ( 섹션 6.2 "MySQL 권한 시스템" 을 참조하십시오). MySQL에 대한 액세스를 제어하려면
GRANT
및REVOKE
문을 사용합니다. 필요 이상의 권한을 부여하지 마십시오. 모든 호스트에 권한을 부여해서는 안됩니다.검사 목록 :
mysql -u root
를 사용해보십시오. 암호를 물어 보지 않고 서버에 연결하는 데 성공하는 경우 모든 사용자가 모든 권한을 가진 MySQLroot
사용자로 MySQL 서버에 연결할 수 있습니다.root
암호 설정에 대한 정보에 특히주의하여 MySQL 설치 단계를 검토하십시오. 섹션 2.10.2 "처음 MySQL 계정 보안 설정" 을 참조하십시오.SHOW GRANTS
문을 사용하여 어떤 계정이 무엇에 액세스 할 수 있는지 확인합니다.REVOKE
문을 사용하여 불필요한 권한을 제거합니다.
일반 텍스트 비밀번호를 데이터베이스에 저장하지 마십시오. 컴퓨터의 보안이 손상된 경우 침입자는 모든 암호 목록을 검색하여 사용할 수 있습니다. 대신
SHA2()
,SHA1()
,MD5()
또는 기타 단방향 해시 기능을 사용하여 해시 값을 저장합니다.레인보우 테이블을 사용한 암호 복구를 방지하기 위해이 함수를 일반 텍스트 암호로 사용하지 않도록하십시오. 대신 소금으로 사용하는 어떤 문자열을 선택하여 hash (hash (비밀번호) + 소금) 값을 사용하십시오.
사전에서 암호를 선택하지 마십시오. 암호를 해독하는 특별한 프로그램이 존재합니다. "xfish98"같은 암호조차도 아주 나쁜 것입니다. 같은 "fish"라는 단어를 표준 QWERTY 키보드에서 키 1 개분 왼쪽으로 밀어 타입했다 "duag98 '쪽이 훨씬 우수합니다. 다른 방법은 문장의 각 단어의 첫 글자를 따서 암호를 사용하는 것입니다 (예를 들어, "Four score and seven years ago"에서 "Fsasya"라는 암호가 있습니다.) 암호를 기억하거나 입력하기 쉽지만 글을 모르는 사람은 추측이 어렵습니다. 이 사례에서 숫자를 나타내는 단어를 더 수치로 대체 "4 score and 7 years ago"라는 어구를 만들고 "4sa7ya '라는 더 추측 어려운 암호를 얻을 수 있습니다.
방화벽에 투자합니다. 이렇게하면 모든 종류의 소프트웨어 악용 중 적어도 50 %에서 보호됩니다. MySQL을 방화벽 또는 비무장 지대 (DMZ)에 배치합니다.
검사 목록 :
nmap
등의 도구를 사용하여 인터넷에서 자신의 포트를 스캔 해보십시오. MySQL은 기본적으로 포트 3306을 사용합니다. 이 포트는 신뢰할 수없는 호스트에 액세스 할 여서는 안됩니다. MySQL 포트가 열려 있는지를 검사하는 간단한 방법으로 하나의 원격 시스템에서 다음 명령을 시도합니다. 여기에서server_host
은 MySQL 서버가 실행중인 호스트의 호스트 이름 또는 IP 주소입니다.shell>
telnet
server_host
3306telnet이 중지되거나 연결이 거부되면 포트가 차단되어 있으며, 이는 예상대로의 결과입니다. 연결을 취득하여 어떤 깨진 문자가 얻어진 경우 포트는 열려 있기 때문에 포트를 열어두면 충분한 이유가 실제로있는 경우를 제외하고 방화벽이나 라우터 닫으 하십시오.
MySQL에 액세스하는 응용 프로그램은 사용자로부터 입력되는 모든 데이터를 신뢰하지 않도록 적절한 방어적인 프로그래밍 기술을 사용하여 설명하도록합니다. 섹션 6.1.7 "클라이언트 프로그래밍 보안 지침" 을 참조하십시오.
일반의 (암호화되지 않은) 데이터를 인터넷을 통해 전송하지 마십시오. 이 정보는 정보를 가로 채기 위해 시간과 능력을 가지고 자신의 목적을 위해 정보를 사용하는 모든 인물에서 액세스 할 수 있습니다. 대신 SSL과 SSH 등의 암호화 된 프로토콜을 사용하십시오. MySQL 내부 SSL 연결을 지원합니다. 다른 기술로 SSH 포트 포워딩을 사용하여 암호화 된 (및 압축 된) 통신 터널을 만드는 방법이 있습니다.
tcpdump과 strings 등의 유틸리티의 사용법에 대해 알아 봅니다. 대부분의 경우, 다음과 같은 명령을 실행하여 MySQL 데이터 스트림이 암호화되지 않은 상태인지 여부를 확인할 수 있습니다.
shell>
tcpdump -l -i eth0 -w - src or dst port 3306 | strings
이것은 Linux에서 실행하는 것 외에 다른 시스템에서도 약간의 변경을 수행하여 작동합니다.
경고평문 데이터가 표시되지 않는 경우,이 정보가 실제로 암호화되어 있는지를 반드시 의미하는 것은 아닙니다. 보안을 강화해야하는 경우, 보안 전문가와 상담하십시오.