IT박스

phpMyAdmin을 보호하는 방법

itboxs 2020. 12. 8. 07:51
반응형

phpMyAdmin을 보호하는 방법


phpmyadmin을 찾으려고하는 내 웹 사이트에 이상한 요청이 있음을 발견했습니다.

/phpmyadmin/
/pma/

기타

이제 apt를 통해 Ubuntu에 PMA를 설치했으며 / phpmyadmin /과 다른 웹 주소를 통해 액세스하고 싶습니다. 변경하려면 어떻게해야합니까?

감사


최신 정보

우분투 9.10 및 아파치 들어, 해당 설정 파일의 위치 /etc/apache2/conf.d/phpmyadmin.conf에 대한 링크이다 /etc/phpmyadmin/apache.conf. 파일에는

Alias /phpmyadmin /usr/share/phpmyadmin

/phpmyadmin불필요한 활동을 피 하려면 첫 번째 를 다른 것으로 변경해야합니다. 예 :

Alias /secret /usr/share/phpmyadmin

가장 큰 위협은 공격자가 다음과 같은 취약성을 활용할 수 있다는 것입니다. 디렉토리 순회 또는 SQL 삽입을 사용 load_file()하여 구성 파일에서 일반 텍스트 사용자 이름 / 암호를 읽은 다음 phpmyadmin 또는 tcp 포트 3306을 통해 로그인합니다. 펜 테스터로서 저는이 공격 패턴을 사용하여 시스템을 손상 시켰습니다.

다음은 phpmyadmin을 잠글 수있는 좋은 방법입니다.

  • 원격 루트 로그인을 허용하지 마십시오! 대신 phpmyadmin은 "쿠키 인증" 을 사용하여 시스템에 액세스 할 수있는 사용자를 제한 하도록 구성 할 수 있습니다 . 당신이 어떤 루트 권한이 필요한 경우 / 드롭 / 추가 생성하지만이없는 수있는 사용자 계정 생성 grant또는 file_priv.
  • file_priv모든 계정에서 권한을 제거하십시오 . file_priv공격자가 파일을 읽거나 백도어를 업로드 할 수 있기 때문에 MySQL에서 가장 위험한 권한 중 하나입니다.
  • phpmyadmin 인터페이스에 액세스 할 수있는 IP 주소를 화이트리스트에 추가합니다. 다음은 .htaccess reulset의 예입니다.
Order deny,allow
Deny from all
allow from 199.166.210.1
  • 다음과 같은 예측 가능한 파일 위치가 없어야합니다 http://127.0.0.1/phpmyadmin. Nessus / Nikto / Acunetix / w3af와 같은 취약성 스캐너가이를 스캔합니다.

  • 공격자가 액세스 할 수 없도록 TCP 포트 3306에서 방화벽을 사용합니다.

  • HTTPS를 사용하지 않으면 데이터와 암호가 공격자에게 유출 될 수 있습니다. 인증서에 대해 $ 30를 포크하지 않으려면 자체 서명을 사용하십시오. 한 번 수락하면 MITM으로 인해 변경된 경우에도 알림을 받게됩니다.

phpMyAdmin에 대한 내 우려 중 하나는 기본적으로 모든 MySQL 사용자가 db에 액세스 할 수 있다는 것입니다. DB의 루트 비밀번호가 유출되면 누군가가 DB를 망칠 수 있습니다. phpMyAdmin에 로그인 할 수있는 MySQL 사용자를 제한하여이를 방지하는 방법을 찾고 싶었습니다.

PhpMyAdmin에서 AllowDeny 구성을 사용하는 것이 매우 유용하다는 것을 알았습니다. http://wiki.phpmyadmin.net/pma/Config#AllowDeny_.28rules.29

AllowDeny를 사용하면 Apache와 유사한 방식으로 phpMyAdmin에 대한 액세스를 구성 할 수 있습니다. '순서'를 명시 적으로 설정하면 '규칙'섹션에 ​​정의 된 사용자에게만 액세스 권한이 부여됩니다. 규칙 섹션에서 phpMyAdmin을 사용하여 액세스 할 수있는 MySql 사용자를 제한합니다.

$cfg['Servers'][$i]['AllowDeny']['order'] = 'explicit'
$cfg['Servers'][$i]['AllowDeny']['rules'] = array('pma-user from all')

이제 MySQL에서 pma-user라는 사용자에 대한 액세스가 제한되었으므로 해당 사용자에게 제한된 권한을 부여 할 수 있습니다.

grant select on db_name.some_table to 'pma-user'@'app-server'

최신 버전의 phpMyAdmin에서는 사용자 이름 + IP 주소에 대한 액세스 권한을 phpMyAdmin의 config.inc.php 파일에 설정할 수 있습니다. 이것은 액세스를 제한하는 훨씬 더 강력하고 강력한 방법입니다 (하드 코딩 URL 및 IP 주소를 통해 Apache의 httpd.conf로).

다음은 모든 사용자를 화이트리스트로 전환하는 방법 (이 목록 외부에있는 사람은 액세스가 허용되지 않음)으로 전환하는 방법과 사용자 루트를 로컬 시스템 및 네트워크로만 제한하는 방법에 대한 전체 예제입니다.

$cfg['Servers'][$i]['AllowDeny']['order'] = 'deny,allow';
$cfg['Servers'][$i]['AllowDeny']['rules'] = array(
    'deny % from all', // deny everyone by default, then -

    'allow % from 127.0.0.1', // allow all local users
    'allow % from ::1',

    //'allow % from SERVER_ADDRESS', // allow all from server IP

    // allow user:root access from these locations (local network)
    'allow root from localhost',
    'allow root from 127.0.0.1',
    'allow root from 10.0.0.0/8',
    'allow root from 172.16.0.0/12',
    'allow root from 192.168.0.0/16',

    'allow root from ::1',

    // add more usernames and their IP (or IP ranges) here -    
    );

출처 : Windows 용 localhost에 phpMyAdmin을 설치하고 보안하는 방법

이는 MySQL 사용자 이름 수준에서 Apache의 URL 권한 또는 .htaccess 파일이 제공 할 수있는 것보다 훨씬 더 세분화 된 액세스 제한을 제공합니다.

phpMyAdmin과 MySQL이 동일한 시스템에 있으므로 로그인 한 사용자의 MySQL Host:필드가 127.0.0.1또는로 설정되어 있는지 확인하십시오 ::1.


대부분의 경우 웹 서버의 어딘가에 다음과 같은 Alias ​​지시문이있을 것입니다.

Alias /phpmyadmin "c:/wamp/apps/phpmyadmin3.1.3.1/"

내 wampserver / localhost 설정에서는 c : /wamp/alias/phpmyadmin.conf에있었습니다.

별명 지시문을 변경하기 만하면됩니다.


또 다른 해결책은 설정없이 구성 파일을 사용하는 것입니다. 처음에는 mysql 루트 로그인 / 비밀번호를 포함해야 할 수도 있습니다. 그래야 모든 것을 설치할 수 있지만 제거 할 수 있습니다.

$ cfg [ '서버'] [$ i] [ 'auth_type'] = '쿠키';

$ cfg [ '서버'] [$ i] [ 'host'] = 'localhost';

$ cfg [ '서버'] [$ i] [ 'connect_type'] = 'tcp';

$ cfg [ '서버'] [$ i] [ 'compress'] = false;

$ cfg [ '서버'] [$ i] [ 'extension'] = 'mysql';

apache / lighhtpd 별칭없이 그대로두면 로그인 화면이 나타납니다. 여기에 이미지 설명 입력

루트로 로그인 할 수 있지만 다른 사용자를 만들고 로컬 액세스를 위해 루트 만 허용하는 것이 좋습니다. 또한 짧지 만 대문자와 특수 문자 수가 포함 된 문자열 암호를 사용하는 것을 잊지 마십시오. !34sy2rmbr!: "쉬운 2 기억"

-편집 : 좋은 암호는 실제로 문법적으로 의미가없는 단어와 비슷 하지만 재미 있기 때문에 기억할 수 있습니다 . 또는 Keepass를 사용하여 강력한 랜덤을 생성하고 쉽게 액세스 할 수 있습니다.


Linux 서버를 실행중인 경우 :

  • SSH를 사용하면 사용자 / 비밀번호 로깅을 금지하고 authorized_keys 파일의 공개 키만 허용 할 수 있습니다.
  • Use putty to connect to your server and open a remote terminal
  • Forward X11 and brings localhost firefox/iceweasel to your desktop (in windows you need Xming software installed)
  • Now you secured your phpMyAdmin throught ssh

This system is quite secure/handy for homeservers -usually with all ports blocked by default-. You only have to forward the SSH port (don't use number 22).

If you like Microsoft Terminal Server you can even set a SSH Tunneling to your computer and connect securely to your web server throught it.

With ssh tunneling you even can forward the 3306 port of your remote server to a local port and connect using local phpMyAdmin or MySQL Workbench.

I understand that this option is an overkill, but is as secure as the access of your private key.


The simplest approach would be to edit the webserver, most likely an Apache2 installation, configuration and give phpmyadmin a different name.

A second approach would be to limit the IP addresses from where phpmyadmin may be accessed (e.g. only local lan or localhost).


The best way to secure phpMyAdmin is the combination of all these 4:

1. Change phpMyAdmin URL
2. Restrict access to localhost only.
3. Connect through SSH and tunnel connection to a local port on your computer
4. Setup SSL to already encrypted SSH connection. (x2 security)

Here is how to do these all with: Ubuntu 16.4 + Apache 2 Setup Windows computer + PuTTY to connect and tunnel the SSH connection to a local port:

# Secure Web Serving of phpMyAdmin (change URL of phpMyAdmin):

    sudo nano /etc/apache2/conf-available/phpmyadmin.conf
            /etc/phpmyadmin/apache.conf
        Change: phpmyadmin URL by this line:
            Alias /newphpmyadminname /usr/share/phpmyadmin
        Add: AllowOverride All
            <Directory /usr/share/phpmyadmin>
                Options FollowSymLinks
                DirectoryIndex index.php
                AllowOverride Limit
                ...
        sudo systemctl restart apache2
        sudo nano /usr/share/phpmyadmin/.htaccess
            deny from all
            allow from 127.0.0.1

        alias phpmyadmin="sudo nano /usr/share/phpmyadmin/.htaccess"
        alias myip="echo ${SSH_CONNECTION%% *}"

# Secure Web Access to phpMyAdmin:

        Make sure pma.yourdomain.com is added to Let's Encrypt SSL configuration:
            https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04

        PuTTY => Source Port (local): <local_free_port> - Destination: 127.0.0.1:443 (OR localhost:443) - Local, Auto - Add

        C:\Windows\System32\drivers\etc
            Notepad - Run As Administrator - open: hosts
                127.0.0.1 pma.yourdomain.com

        https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/ (HTTPS OK, SSL VPN OK)
        https://localhost:<local_free_port>/newphpmyadminname/ (HTTPS ERROR, SSL VPN OK)

        # Check to make sure you are on SSH Tunnel
            1. Windows - CMD:
                ping pma.yourdomain.com
                ping www.yourdomain.com

                # See PuTTY ports:
                netstat -ano |find /i "listening"

            2. Test live:
                https://pma.yourdomain.com:<local_free_port>/newphpmyadminname/

If you are able to do these all successfully,

you now have your own url path for phpmyadmin,
you denied all access to phpmyadmin except localhost,
you connected to your server with SSH,
you tunneled that connection to a port locally,
you connected to phpmyadmin as if you are on your server,
you have additional SSL conenction (HTTPS) to phpmyadmin in case something leaks or breaks.

You can use the following command :

$ grep "phpmyadmin" $path_to_access.log | grep -Po "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" | sort | uniq | xargs -I% sudo iptables -A INPUT -s % -j DROP 

Explanation:

Make sure your IP isn't listed before piping through iptables drop!!

This will first find all lines in $path_to_access.log that have phpmyadmin in them,

then grep out the ip address from the start of the line,

then sort and unique them,

그런 다음 규칙을 추가하여 iptables에 드롭하십시오.

다시 말하지만 echo %iptables 명령 대신 끝에 편집 하여 IP가 없는지 확인하십시오. 실수로 서버에 대한 액세스를 금지하지 마십시오!

한계

Mac 또는 grep -P가없는 시스템에있는 경우 명령의 grep 부분을 변경해야 할 수 있습니다. 모든 시스템이 xargs로 시작하는지 확실하지 않으므로 설치해야 할 수도 있습니다. bash를 많이한다면 어쨌든 매우 유용합니다.

참고 URL : https://stackoverflow.com/questions/2631269/how-to-secure-phpmyadmin

반응형