source

PHP에서 데이터베이스 암호를 보호하는 방법

factcode 2022. 9. 25. 00:13
반응형

PHP에서 데이터베이스 암호를 보호하는 방법

PHP 어플리케이션이 데이터베이스 접속을 확립할 때 일반적으로 로그인과 패스워드를 전달해야 합니다.응용 프로그램에 대해 단일 최소 권한 로그인을 사용하는 경우 PHP는 해당 로그인과 암호를 알아야 합니다.그 비밀번호를 보호하는 가장 좋은 방법은 무엇입니까?PHP 코드로 쓰는 것은 좋은 생각이 아닌 것 같습니다.

일부 사용자가 비밀번호를 데이터베이스에 저장하는 방법에 대한 질문으로 잘못 읽었습니다.그것은 틀렸다.데이터베이스에 접속할 수 있는 패스워드를 보존하는 방법에 대해 설명합니다.

통상적인 해결책은 패스워드를 소스 코드에서 컨피규레이션파일로 이동하는 것입니다.그런 다음 관리 및 설정 파일 보안은 시스템 관리자에게 맡기십시오.이렇게 하면 개발자는 프로덕션 비밀번호에 대해 아무것도 알 필요가 없으며 소스 컨트롤에 비밀번호 기록이 없습니다.

다른 사용자의 서버에서 호스팅하고 있으며 웹 루트 외부에서 액세스할 수 없는 경우 항상 파일에 암호 및/또는 데이터베이스 연결을 입력한 다음 .htaccess를 사용하여 파일을 잠글 수 있습니다.

<files mypasswdfile>
order allow,deny
deny from all
</files>

가장 안전한 방법은 PHP 코드에 지정된 정보를 전혀 보유하지 않는 것입니다.

Apache를 사용하는 경우 이는 httpd.conf 또는 가상 호스트 파일 내의 연결 세부 정보를 설정하는 것을 의미합니다.이 경우 파라미터 없이 mysql_connect()를 호출할 수 있습니다.즉, PHP는 사용자의 정보를 출력하지 않습니다.

이러한 파일의 값은 다음과 같이 지정합니다.

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.host      server

그런 다음 다음과 같이 mysql 연결을 엽니다.

<?php
$db = mysqli_connect();

또는 다음과 같이 합니다.

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.host"));

웹 루트 외부에 있는 파일에 저장합니다.

매우 안전한 시스템의 경우 구성 파일(시스템 관리자가 자체적으로 보호)에서 데이터베이스 암호를 암호화합니다.애플리케이션/서버의 기동시에, 애플리케이션은 시스템 관리자에게 복호화 키의 입력을 요구합니다.다음으로 데이터베이스 패스워드를 설정 파일에서 읽어 복호화하여 나중에 사용할 수 있도록 메모리에 저장합니다.복호화된 메모리에 저장되기 때문에 여전히 100% 보안은 아니지만, 어느 시점에서는 '충분히 안전하다'고 불러야 합니다.

이 솔루션은 오픈 소스 애플리케이션과 클로즈드 소스 애플리케이션 모두에 유용하다는 점에서 일반적입니다.

  1. 애플리케이션의 OS 유저를 작성합니다.http://en.wikipedia.org/wiki/Principle_of_least_privilege 를 참조해 주세요.
  2. 비밀번호를 사용하여 해당 사용자의 (세션 외) OS 환경변수를 만듭니다.
  3. 해당 사용자로 응용 프로그램 실행

장점:

  1. 실수로 소스 제어에 패스워드를 체크하지 않습니다.그 이유는 패스워드를 체크할 수 없기 때문입니다.
  2. 실수로 파일 권한을 망치는 일은 없습니다.그럴 수도 있지만, 영향을 주진 않을 거예요.
  3. 루트 또는 해당 사용자만 읽을 수 있습니다.루트는 모든 파일 및 암호화 키를 읽을 수 있습니다.
  4. 암호화를 사용하는 경우 키를 안전하게 저장하는 방법은 무엇입니까?
  5. x-플랫폼으로 동작
  6. 신뢰할 수 없는 하위 프로세스에 envvar를 전달하지 마십시오.

이 방법은 매우 성공한 헤로쿠에 의해 제안되었다.

credential이 저장되어 있는 파일에 데이터베이스 연결을 생성할 수 있는지 확인합니다.connect 문의 credential을 인라인합니다.

mysql_connect("localhost", "me", "mypass");

그렇지 않으면 메모리에 없는 credential은 메모리에서 읽을 수 없기 때문에 connect 스테이트먼트 후에 credential을 설정 해제하는 것이 가장 좋습니다.

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  

이전에는 DB 사용자/패스를 구성 파일에 저장했지만 이후 편집 모드에 도달하여 Defense in Deepth 정책을 채택했습니다.

응용 프로그램이 손상된 경우 사용자가 구성 파일에 대한 읽기 액세스 권한을 가지므로 크래커가 이 정보를 읽을 수 있습니다.컨피규레이션파일은 버전 제어에 휘말리거나 서버에 카피할 수도 있습니다.

Apache VirtualHost에 설정된 환경변수에 사용자/패스 저장으로 전환했습니다.이 구성은 루트로만 읽을 수 있습니다. Apache 사용자가 루트로 실행되고 있지 않아야 합니다.

여기서 단점은 비밀번호가 글로벌 PHP 변수에 있다는 것입니다.

이 위험을 줄이기 위해 다음과 같은 예방 조치를 취합니다.

  • 비밀번호는 암호화되어 있습니다.PDO 클래스를 확장하여 암호를 해독하는 로직을 포함합니다.누군가 접속을 확립한 코드를 읽어내도 접속이 패스워드 자체가 아닌 암호화된 패스워드로 확립되어 있는 것은 분명하지 않습니다.
  • 암호화된 비밀번호는 글로벌 변수에서 개인 변수로 이동합니다.응용 프로그램은 이를 즉시 실행하여 글로벌 공간에서 값을 사용할 수 있는 창을 단축합니다.
  • phpinfo() 는 디세이블입니다.PHPInfo는 환경변수를 포함한 모든 것의 개요를 쉽게 파악할 수 있는 대상입니다.

PostgrePostgre SQL을 검색합니다.~/.pgpass패스워드를 자동으로 입력합니다.자세한 내용은 설명서를 참조하십시오.

데이터베이스에 접속하기 위해 패스워드가 필요하다고 하셨기 때문에 선택사항이 다소 한정되어 있습니다.일반적인 방법으로는 메인스크립트가 아닌 별도의 Configuration파일에 사용자 이름과 비밀번호를 저장하는 방법이 있습니다.그럼 메인 웹 트리 밖에 보관해 주세요.즉, php 파일이 실행되는 것이 아니라 단순히 텍스트로 표시되는 웹 구성 문제가 있는 경우 암호를 노출하지 않았습니다.

그 외에는 올바른 회선을 사용하고 있으며, 사용 중인 계정에 대한 최소한의 액세스만 가능합니다.거기에 더해

  • 다른 용도로 사용자 이름/비밀번호 조합 사용 안 함
  • 해당 사용자의 웹 호스트로부터의 연결만 허용하도록 데이터베이스 서버를 구성합니다(DB가 같은 시스템에 있는 경우 localhost가 더 좋습니다).이렇게 하면 자격 증명이 노출되어도 기계에 대한 다른 액세스 권한이 없는 한 아무에게도 쓸모가 없습니다.
  • 패스워드를 난독화하면(ROT13도 가능), 파일에 액세스 할 수 있는 경우는 그다지 방어가 되지 않지만, 적어도 캐주얼한 표시는 막을 수 있습니다.

피터야.

이 문제를 다음과 같이 해결했습니다.

  1. 다른 패스워드 서버로부터의 오픈 접속이 있는 서버의 memcache 를 사용합니다.
  2. 비밀번호(또는 암호화된 모든 password.php 파일)와 복호화 키를 memcache에 저장합니다.
  3. 웹사이트는 패스워드 파일의 패스프레이즈를 보관하고 있는memcache 키를 호출하여 모든 패스워드를 메모리로 복호화합니다.
  4. 패스워드 서버는 5분마다 새로운 암호화된 패스워드 파일을 송신합니다.
  5. 암호화된 비밀번호를 사용하는 경우.php는 당신의 프로젝트에 감사를 붙여서 이 파일이 외부에서 터치되었는지 또는 표시되었는지 확인합니다.이 경우는, 자동적으로 메모리를 클리닝 할 수 있을 뿐만 아니라, 액세스를 위해서 서버를 닫을 수도 있습니다.

파일에 데이터베이스 비밀번호를 입력하여 파일을 제공하는 사용자에게 읽기 전용으로 만듭니다.

php 서버 프로세스가 데이터베이스에 액세스하는 것만을 허용하는 수단이 없는 한, 이것이 당신이 할 수 있는 거의 모든 것입니다.

브라우저로부터의 패스워드가 아닌 데이터베이스 패스워드에 대해 말하는 경우, 표준적인 방법은 서버의 PHP 설정 파일에 데이터베이스 패스워드를 넣는 것입니다.

패스워드를 포함한 php 파일에 적절한 권한이 있는지 확인하기만 하면 됩니다.즉, 웹 서버와 사용자 계정으로만 읽을 수 있어야 합니다.

또 다른 트릭은 다음과 같은 개별 PHP 설정 파일을 사용하는 것입니다.

<?php exit() ?>

[...]

Plain text data including password

이로 인해 액세스 규칙을 올바르게 설정할 수 없습니다.그러나 웹 사이트가 해킹당했을 경우, "필수" 또는 "포함"이 스크립트의 첫 번째 줄에서 종료되기 때문에 데이터를 얻기가 더욱 어렵습니다.

단, 컨피규레이션파일을 Web 경유로 액세스 할 수 있는 디렉토리에 두지 말아 주세요.컨트롤러 코드, css, 그림 및 js가 포함된 "Web" 폴더가 있어야 합니다.그게 다예요.그 외 모든 것은 오프라인 폴더에 저장됩니다.

컨피규레이션파일에 격납하는 것만으로, 통상은 그렇게 됩니다.다음 사항을 확인합니다.

  1. 네트워크 외부의 서버로부터의 데이터베이스 접근을 허용하지 않습니다.
  2. 사용자에게 실수로 비밀번호를 보여주지 않도록 주의하십시오(오류 메시지 또는 실수로 HTML로 제공되는 PHP 파일 등).

가장 좋은 방법은 비밀번호를 전혀 저장하지 않는 것입니다!
예를 들어 Windows 시스템에서 SQL Server에 연결하는 경우 통합 인증을 사용하여 현재 프로세스의 ID를 사용하여 암호 없이 데이터베이스에 연결할 수 있습니다.

패스워드를 사용해 접속할 필요가 있는 경우는, 우선 강력한 암호화(예를 들면 AES-256을 사용해 암호화 키를 보호하거나 비대칭 암호화를 사용해 OS에 증명서를 보호하거나)를 사용해 강력한 ACL을 가지는 설정 파일(Web 디렉토리 외부)에 저장합니다.

실제로는 다음과 같은 이유로 데이터베이스 crendential을 환경변수에 저장하는 것이 가장 좋습니다.

  • 이러한 자격 증명은 환경에 따라 다르므로 개발/프로세서에는 동일한 자격 증명이 없습니다.모든 환경에서 동일한 파일에 저장하는 것은 실수입니다.
  • credential은 비즈니스 로직과 관련이 없습니다.즉, 코드에 로그인 및 패스워드는 관계가 없습니다.
  • 비즈니스 코드 클래스 파일을 생성하지 않고 환경 변수를 설정할 수 있으므로 Git에서 credential 파일을 커밋에 추가하는 실수를 하지 않습니다.
  • 환경변수는 슈퍼글로벌입니다.파일을 포함하지 않고 코드의 모든 장소에서 사용할 수 있습니다.

사용방법

  • $_ENV 어레이 사용:
    • 설정:$_ENV['MYVAR'] = $myvar
    • 취득:echo $_ENV["MYVAR"]
  • php 함수 사용:
    • putenv 기능을 사용한 설정 -putenv("MYVAR=$myvar");
    • getenv 기능을 이용하는 중 -getenv('MYVAR');
  • vhosts 파일.htaccess에는 있지만 다른 파일에 있고 이 방법으로도 문제를 해결할 수 없으므로 권장되지 않습니다.

envars 등의 파일을 쉽게 드롭할 수 있습니다.모든 환경변수가 포함된 php를 실행하여 실행합니다(php envvars.php삭제해 주세요.조금 구식이지만 여전히 작동하며 서버에 자격 증명이 있는 파일이 없고 코드에 자격 증명이 없습니다.조금 힘들기 때문에 프레임워크가 더 잘합니다.

Symfony를 사용한 예(PHP뿐만 아니라)Symfony와 같은 최신 프레임워크에서는 환경변수를 사용할 것을 권장합니다.env는 커밋되지 않은 파일이나 명령줄에 직접 저장할 수 있습니다.즉, 다음과 같은 작업을 수행할 수 있습니다.

문서:

언급URL : https://stackoverflow.com/questions/97984/how-to-secure-database-passwords-in-php

반응형