내가 본 대부분의 PHP / MySQL 기반 웹 사이트의 구조를 살펴보면 약간의 정보를 수집하면 로깅을위한 정보를 저장하는 설정 또는 구성 파일이 있기 때문에 데이터베이스 비밀번호를 식별하는 것이 그리 어렵지 않은 것으로 보입니다. DB에. 내 데이터베이스의 권한이 원격 요청에 대해 적절하게 제한되도록하는 기본적인주의 사항 외에,이 정보를 보호하기 위해 내 프로젝트에서 어떤 옵션을 구현할 수 있습니까?
내가 본 대부분의 PHP / MySQL 기반 웹 사이트의 구조를 살펴보면 약간의 정보를 수집하면 로깅을위한 정보를 저장하는 설정 또는 구성 파일이 있기 때문에 데이터베이스 비밀번호를 식별하는 것이 그리 어렵지 않은 것으로 보입니다. DB에. 내 데이터베이스의 권한이 원격 요청에 대해 적절하게 제한되도록하는 기본적인주의 사항 외에,이 정보를 보호하기 위해 내 프로젝트에서 어떤 옵션을 구현할 수 있습니까?
답변:
비밀번호 저장에 대한 직접적인 대답은 아니지만 일반적으로 웹 애플리케이션을 작성할 때 최소한 두 개의 데이터베이스 연결을 사용합니다. 하나는 사용자 관련 활동에 99 %, 제한된 권한이 있고 다른 하나는 '관리'기능에 사용됩니다 (사용자 삭제 등).
다른 사람의 패키지를 설치하는 경우에는 일반 사용자 유형 작업을 수행 할 수있는 데이터베이스 액세스 권한 만있는 공개 인스턴스와 IP 제한이있는 두 번째 인스턴스를 설치합니다. 모든 'admin'유형 활동에 사용해야하는 로컬 로컬 서브넷 (다른 머신 일 수도 있음). 둘 다 테이블을 수정하는 데 액세스 할 수있는 권한이 없습니다 ... 웹 응용 프로그램이 검증되지 않은 자체 업데이트 작업을 실행하도록 허용하는 것보다 기본 데이터베이스 도구를 사용하는 것이 좋습니다.
더 나아가서 주어진 작업을 위해 특별히 더 많은 연결을 추가 할 수 있습니다 ... 따라서 사용자 생성 및 암호 관리 작업은 사용자 테이블에 대한 추가 권한이있는 사용자를 통과하고 로그인에는 인증 할 데이터베이스 권한이 있습니다. 등
이런 식으로 SQL 주입 공격이 발생하면 대부분의 웹 페이지에서 실제로 중요한 작업을 수행 할 수 없습니다. 암호 해시를 볼 수 없으며 새로운 관리자를 추가 할 수 없습니다 (그들이 할 수는 없음) 어쨌든 등) 여전히 컴퓨터에서 쉘을 얻는 데 도움이되지 않지만 속도가 느려집니다.
나는 가능하면 로컬 소켓을 통해 PostgreSQL의 'Ident'인증 을 사용하는 것을 좋아합니다 . 이렇게하면 로컬 사용자가 로컬 컴퓨터의 Unix / Windows 사용자에게 직접 매핑되므로 암호 저장에 대해 걱정할 필요가 없습니다. 그래도 이것이 MySQL의 옵션이라고 생각하지 않습니다.
데이터베이스와 웹 서버가 별도의 두 컴퓨터에있는 경우 SSL을 통해 MD5 암호를 사용합니다. 적대자가 내 프론트 엔드 서버에 액세스 할 수있는 경우 데이터베이스와 통신하는 방법을 알아 내기 전에 시간 문제 일뿐입니다.
암호가 일반 텍스트로 저장된 경우 해시 (MD5, SHA), Luke를 사용하십시오!
프로그래밍 언어에 따라 로그인 자격 증명을 암호화 할 수 있지만 해석 된 언어를 실행중인 경우 시스템에 액세스 할 경우 자격 증명을 알아낼 수 없도록 할 수있는 방법이 없습니다.
C ++ 등을 실행하는 경우 솔트 된 암호화 / 암호 해독 기능을 생성 / 찾기하고 그를 통해 자격 증명을 실행하고 결과 해시를 시스템에 파일로 저장하는 것이 좋습니다.
PHP 등 mcrypt_encrypt()
을 실행하는 경우 자격 증명에 대한 래퍼를 작성 하고 자격 증명을 소금에 넣은 다음 일부 코드 난독 화를 실행하여 해커가 시스템에 액세스 할 수있는 경우 속도를 늦추십시오.