워드프레스 로그인 무작위 대입 공격을 막는 방법입니다.

All In One WP Security 같은 플러그인으로도 방어가 가능하지만 mod_qos 에 아래의 옵션으로 여러개의 VirtualHost 전체에 대한 Brute force 공격을 막아줄 수가 있습니다.

<IfModule mod_qos.c>
    SetEnvIf	Request_URI ^/wp-login(.*)$ LimitLogin
    QS_ClientEventLimitCount 10 3600 LimitLogin
    <Location /__qos>
        SetHandler qos-viewer
        Order Deny,Allow
        Deny from All
        Allow from 192.168.
    </Location>
</IfModule>

1시간 동안 10번 이상 시도시 접근을 제한하는 설정입니다.

 

원래 mod_qos 는 아파치 속도 제어 모듈인데 이와 같은 유용한 기능이 있어서 좋은것 같습니다.

아 그리고 fail2ban 같은 모듈로도 방어가 가능합니다.

 

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

CentOS 8 Stream 버전에서 dnf 로 phpMyAdmin 을 설치했더니 로그인 하고 첫 화면에 아래와 같은 문구가 보이는군요~

 

$cfg[]TempDir''(/var/lib/phpMyAdmin/temp/)에 액세스할 수 없음. phpMyAdmin은 템플릿을 캐시할 수 없으며 이로 인해 속도가 느려질 것이다.

 

[root@itrooms phpMyAdmin]# ls -l /var/lib/phpMyAdmin/
total 0
drwxr-x---. 2 apache apache 30 Feb  1 14:36 cache
drwxr-x---. 2 apache apache  6 May 12  2022 config
drwxr-x---. 2 apache apache  6 May 12  2022 save
drwxr-x---. 2 apache apache  6 May 12  2022 temp
drwxr-x---. 2 apache apache  6 May 12  2022 upload
[root@itrooms phpMyAdmin]# chmod 777 /var/lib/phpMyAdmin/temp

해당 디렉토리의 퍼미션을 변경해 주면 됩니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

CentOS 8.x 버전에서 테스트 되었지만 7.x 버전에서도 동일합니다.

 

mariadb 비밀번호가 기억나지 않을때 초기화 시켜주는 방법입니다.

 

[root@itrooms ~]# systemctl stop mariadb
[root@itrooms ~]# mysqld_safe --skip-grant-tables --skip-networking &
[1] 4185
[root@itrooms ~]# 230202 13:55:29 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
230202 13:55:29 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql

먼저 mariadb 데몬을 stop 시켜줍니다.

그리고 두번째 줄의 명령어 "mysqld_safe --skip-grant-tables --skip-networking &" 를 실행하면 백그라운드로 실행되기 때문에 엔터를 한번 쳐줍니다.

 

mysql_secure_installation 으로 root 비밀번호를 초기화 시켜줍니다. 어디서 많이 보던 명령어죠~ ㅎ

물론 mysql -u root -p 로 접속해서 비밀번호를 변경하는 방법도 있지만 번거롭기 때문에 이 방법을 써봤습니다.

[root@itrooms ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

이제 백그라운드로 실행되고 있는 프로세서를 종료시켜줍니다.

Thanks for using MariaDB!
[root@itrooms ~]# pstree -p | grep mysql
           |                                                                             |-mysqld_safe(4185)---mysqld(4477)-+-{mysq+
[root@itrooms ~]# kill -9 4185 4477
[root@itrooms ~]# systemctl start mariadb
[1]+  Killed                  mysqld_safe --skip-grant-tables --skip-networking

그리고 systemstl start mariadb 로 다시 시작해주면 됩니다.

프로세서를 강제로 중지시켜 주지 않으면 socket 충돌로 데몬이 재실행이 되지 않습니다.

그래서 강제로 종료시켜 준것입니다.

물론 서버를 재부팅해도 되긴합니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

CentOS 8 Stream 버전에서 phpMyAdmin 을 다운로드 받아서 설치했더니 아래와 같은 오류가 나오네요~

phpMyAdmin Error session_start Failed Permision denied

session.save_path 디렉토리의 퍼미션을 확인해 봐야겠습니다.

phpMyAdmin - Error
Error during session start; please check your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.

session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)

session_start(): Failed to read session data: files (path: /var/opt/remi/php74/lib/php/session)

php-fpm 버전을 7.4 로 설정했더니 저렇게 오류가 나오는군요~

 

[root@ivps share]# ls -l /var/opt/remi/php74/lib/
total 0
drwxr-xr-x. 2 root root   6 Apr  9  2020 games
drwxr-xr-x. 2 root root   6 Apr  9  2020 misc
drwxr-xr-x. 5 root root 115 Feb  1 16:44 pear
drwxrwx---. 6 root root  68 Feb  1 16:44 php
drwxr-xr-x. 2 root root   6 Apr  9  2020 rpm-state
[root@ivps share]# ls -l /var/opt/remi/php74/lib/php
total 0
drwxrwx---. 2 root apache  6 Dec 19 22:40 opcache
drwxr-xr-x. 2 root root   67 Feb  1 16:44 peclxml
drwxrwx---. 2 root apache  6 Dec 19 22:40 session
drwxrwx---. 2 root apache  6 Dec 19 22:40 wsdlcache

디렉토리 퍼미션을 777 로 바꿔봅니다.

[root@ivps ~]# chmod 777 /var/opt/remi/php74/lib/php
[root@ivps ~]# chmod 777 /var/opt/remi/php74/lib/php/session

퍼미션을 바꿔주니 이제 잘 작동하는군요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

CentOS 8.x 버전에서 부터는 yum install phpMyAdmin 으로 설치가 안되는군요~

직접 다운로드 받아서 설치하는 방법이 있긴 하지만 엄청 번거롭습니다.

 

아래는 dnf 명령어로 간단하게 설치 하는 방법입니다.

dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf -y --enablerepo=remi install phpMyAdmin

엄청 간단하지요~ ㅎ

 

이제 외부에서 접속이 가능하게 아파치 설정을 바꾸어 주면 됩니다.

<Directory /usr/share/phpMyAdmin/>
   AddDefaultCharset UTF-8
   #Require local
   Require all granted
</Directory>

# systemctl restart httpd

아파치를 재시작 해주고 접속합니다.

 

제 경우엔 PHP-FPM 으로 설정이 되어 있어서 브라우저 화면에 아무것도 뜨지 않는 문제가 있었습니다.

그래서 wget https://files.phpmyadmin.net/phpMyAdmin/5.1.4/phpMyAdmin-5.1.4-all-languages.zip 다운로드 받아서 설치하고 오류를 확인해 봤더니 session.save_path 디렉토리 퍼미션 문제더군요~

이런 경우는 https://ivps.tistory.com/814 여기를 참고하세요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

CentOS 7.9 에서 아파치 + PHP-FPM 포트 방식으로 잘 돌아가던 환경에서 소켓 방식으로 바꿨더니 아래와 같은 에러를 뿜어내는군요~


[Wed Feb 01 08:27:58.928096 2023] [proxy:error] [pid 3661] (13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /var/opt/remi/php81/run/php-fpm/www.sock (*) failed
[Wed Feb 01 08:27:58.928143 2023] [proxy_fcgi:error] [pid 3661] [client xxx.xxx.xxx.xxx:50967] AH01079: failed to make connection to backend: httpd-UDS

 

PHP8.1 PHP8.2 같은 소켓방식으로 설정했는데 8.2버전은 멀쩡합니다.

8.1에서만 문제가 생기던데 일단 소켓 파일의 퍼미션 부터 확인해 보니 두 파일의 퍼미션이 다르군요~


[root@ivps ~]# ls -l /var/opt/remi/php74/run/php-fpm/www.sock
srw-rw---- 1 root root 0 Feb  1 10:04 /var/opt/remi/php74/run/php-fpm/www.sock
[root@ivps ~]# ls -l /var/opt/remi/php81/run/php-fpm/www.sock
srw-rw---- 1 root root 0 Jan 31 17:56 /var/opt/remi/php81/run/php-fpm/www.sock
[root@ivps ~]# ls -l /var/opt/remi/php82/run/php-fpm/www.sock
srw-rw-rw- 1 root root 0 Jan 31 17:45 /var/opt/remi/php82/run/php-fpm/www.sock

디폴트 listen.mode 가 버전 마다 차이가 있나봅니다.
# vi /etc/opt/remi/php81/php-fpm.d/www.conf
listen.mode = 0666

위 처럼 수정합니다.

# systemctl restart php81-php-fpm

 

이제 잘 작동하는군요~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

PHP-FPM 설정파일에서 listen 부분을 포트방식에서 소켓으로 변경했더니 아래와 같은 오류가 발생하는군요~

listen = /var/opt/remi/php74/run/php-fpm/www.sock
;listen = 127.0.0.1:9074

 

2023/01/31 06:00:01 [crit] 2476#0: *1 connect() to
 unix:/var/opt/remi/php74/run/php-fpm/www.sock failed (13: Permission denied) while connecting to upstream,
 client: xxx.xxx.xxx.xxx, server: www.example.com, request: "GET / HTTP/1.1",
 upstream: "fastcgi://unix:/var/opt/remi/php74/run/php-fpm/www.sock:", host: "www.example.com"

 

# chown nginx:nginx /var/opt/remi/php74/run/php-fpm/www.sock

이렇게 소유권을 바꿔주는 방법도 있긴하지만 systemctl restart php74-php-fpm 을 하면 다시 퍼미션을 원래대로 돌아가서 매번 변경해주어야 합니다.

 

위와 같이 하면 번거로우니 아래의 방법을 사용합니다.

# vi /etc/opt/remi/php74/php-fpm.d/www.conf

listen.mode = 0666

위와 같이 수정하고 systemctl restart php74-php-fpm 을 재시작하고 확인합니다.

 

 

 

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

오라클 클라우드에서 부트볼륨을 200GB 로 생성해서 확장을 했더니 파티션 Type 이 "Microsoft basic" 으로 되어있네요~

[root@itrooms ~]# fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disk label type: gpt
Disk identifier: AB94BECD-0ED5-4801-B14B-A1157B276C0B


#         Start          End    Size  Type            Name
 1         2048      1050623    512M  EFI System      EFI System Partition
 2      1050624     17827839      8G  Linux swap
 3     17827840    419430365  191.5G  Microsoft basic

gdisk를 이용해서 리눅스 파티션으로 변경해줍니다.

[root@itrooms ~]# gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sda: 419430400 sectors, 200.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): AB94BECD-0ED5-4801-B14B-A1157B276C0B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 419430366
Partitions will be aligned on 2048-sector boundaries
Total free space is 2015 sectors (1007.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition
   2         1050624        17827839   8.0 GiB     8200
   3        17827840       419430365   191.5 GiB   0700

Command (? for help): t
Partition number (1-3): 3
Current type is 'Microsoft basic data'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): p
Disk /dev/sda: 419430400 sectors, 200.0 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): AB94BECD-0ED5-4801-B14B-A1157B276C0B
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 419430366
Partitions will be aligned on 2048-sector boundaries
Total free space is 2015 sectors (1007.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         1050623   512.0 MiB   EF00  EFI System Partition
   2         1050624        17827839   8.0 GiB     8200
   3        17827840       419430365   191.5 GiB   8300

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.
[root@itrooms ~]# fdisk -l
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 1048576 bytes
Disk label type: gpt
Disk identifier: AB94BECD-0ED5-4801-B14B-A1157B276C0B


#         Start          End    Size  Type            Name
 1         2048      1050623    512M  EFI System      EFI System Partition
 2      1050624     17827839      8G  Linux swap
 3     17827840    419430365  191.5G  Linux filesyste

Hex code or GUID 항목에서 8300 이나 8e00 으로 변경해주면 됩니다.

 

혹시 모르니 재부팅 해줍니다~

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

PHP 7.2, 7.4 버전에서 멀쩡하던게 8.1, 8.2 버전에서 오류가 발생하네요~

 

AH01071: Got error 'PHP message: PHP Fatal error:  Array and string offset access syntax with curly braces is no longer supported in /home/example/www/_wp_/wp-includes/script-loader.php on line 757'

AH01071: Got error 'PHP message: PHP Fatal error:  Uncaught Error: Call to undefined function get_magic_quotes_gpc() in /home/example/www/_wp_/wp-includes/load.php:926

 

/wp-includes/script-loader.php
        foreach ( $tinymce_settings as $key => $value ) {
                if ( is_bool( $value ) ) {
                        $val       = $value ? 'true' : 'false';
                        $init_obj .= $key . ':' . $val . ',';
                        continue;
                } elseif ( ! empty( $value ) && is_string( $value ) && (
                        ( '{' == $value{0} && '}' == $value{strlen( $value ) - 1} ) ||
                        ( '[' == $value{0} && ']' == $value{strlen( $value ) - 1} ) ||
                        preg_match( '/^\(?function ?\(/', $value ) ) ) {
                        $init_obj .= $key . ':' . $value . ',';
                        continue;
                }
                $init_obj .= $key . ':"' . $value . '",';
        }

위에서 {} 중괄호 이부분을 [] 대괄호로 변경합니다.

                        ( '{' == $value[0] && '}' == $value[strlen( $value ) - 1] ) ||
                        ( '[' == $value[0] && ']' == $value[strlen( $value ) - 1] ) ||

그리고 이번엔 get_magic_quotes_gpc 에러인데 8.0 버전 부터 이 함수가 없어졌다는군요 ㅋ

/wp-includes/load.php
/wp-includes/formatting.php
        if ( get_magic_quotes_gpc() ) {
        }
=>
        if ( function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() ) {
        }

Warning 부분은 제외 하고 일단 3개의 파일을 수정하니 작동을 합니다.

 

그래도 워드프레스는 당분간 PHP 7.x 버전을 사용하는게 좋아보입니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,

리눅스는 버전이 바뀔때 마다 PHP Multiple 패키지 설치할때 마다 오류 때문에 문제군요~

 

웹브라우저 화면에는 "File not found." 가 뜨고 아파치 에러 로그엔 아래 처럼 로그가 나옵니다.

 

[proxy_fcgi:error] [pid 27067] [client XXX.XXX.XXX.XXX:63340] AH01071: Got error 'Primary script unknown'

 

아파치 설정에서 ProxyPassMatch 를 사용했더니 위와 같은 에러가 발생하네요~

 

    #ProxyPassMatch ^/(.*\.(php|htm|html)(/.*)?)$ fcgi://127.0.0.1:9082/home/example/www/$1

위의 방식을 아래 처럼 하니 괜찮아지는군요~

    <IfModule mod_proxy_fcgi.c>
        <FilesMatch \.(php|htm|html)$>
            SetHandler "proxy:fcgi://127.0.0.1:9000/"
        </FilesMatch>
    </IfModule>

아파치 설정후 systemctl restart httpd 로 재확인합니다.

 

블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,