728x90

Rocky Linux 9버전에서는 기본으로 PHP 8.X가 설치되어 있는데 기존에 개발한 코드가 PHP 7.4 기반이라 PHP7.4를 설치하는 스크립트를 시행착오를 겪어가면서 거의 완벽에 가까운 스크립트를 작성했다.

스크립트 구성후 개발한 코드로 동작시켜 보니 RSA 암호화/복호화가 제대로 동작되지 않아서 원인 찾느라고 쌩쇼를 했다.

 

#############################################
######### RockyOS 9.5 PHP 7.4 설치 ##########
#############################################
# 본 스크립트는 반드시 관리자 권한에서 실행해야 한다.
# openssl 버전 확인 => TLS 1.3을 지원하더라.
openssl version
 
## 현재 설치된 PHP 버전 확인
dnf module list php
 
Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
 
 
dnf -y install expat-devel
 
## 설치확인
dnf list installed | grep MariaDB
rpm -qa | grep MariaDB
 
 
# 설치되어 있는 PHP 모듈 확인 방법
php -m
 
# 시스템 업데이트
sudo dnf -y update
 
sudo dnf -y install wget unzip mc git nmap
 
# SSL 관련 패키지 설치 확인
sudo dnf -y install openssl openssl-devel
 
# 1. Apache 설치
sudo dnf install httpd -y
 
# 2.EPEL 및 Remi 저장소 설치
sudo dnf -y install epel-release
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
 
# 3.PHP 모듈 재설정 및 Remi 저장소 활성화
sudo dnf module reset php
sudo dnf module enable php:remi-7.4
 
# 4.PHP 7.4 및 필요한 확장 모듈 설치
sudo dnf -y install php php-cli php-fpm php-curl php-mysqlnd php-gd php-opcache php-zip php-intl php-common php-bcmath 
sudo dnf -y install php-imagick php-xmlrpc php-json php-readline php-redis php-mbstring php-apcu php-xml php-dom php-redis 
sudo dnf -y install php-memcached php-memcache php-devel php-openssl 
sudo dnf -y install mod_ssl openssh
sudo dnf -y install ImageMagick ImageMagick-devel
 
# PHP 7.4 에서는 설치 필요. PHP 8.X에서는 에러 표시함.
sudo dnf -y install php-mcrypt
 
# 5. PHP 버전 확인
php -v
 
 
# Apache 버전 확인
httpd -v
 
 
# PHP와 웹 서버 간 통신이 차단될 수 있으니 SELinux 설정 확인
sudo setsebool -P httpd_can_network_connect 1
 
 
# 서비스 시작
sudo systemctl start php-fpm
sudo systemctl start httpd
 
# 서비스 활성화
sudo systemctl enable php-fpm
sudo systemctl enable httpd
 
systemctl stop httpd
systemctl restart httpd
systemctl status httpd
 
#####################################################################
## httpd.conf 파일 수정
#####################################################################
vi /etc/httpd/conf/httpd.conf
ServerName localhost
 
DocumentRoot "/var/www/html"
 
<Directory "/var/www/html">
    Options +FollowSymLinks -Indexes
    AllowOverride All
    Require all granted
    <LimitExcept GET POST>
      Order deny,allow
      Deny from all
    </LimitExcept>
</Directory>
 
<IfModule dir_module>
    DirectoryIndex index.html index.php index.jsp
</IfModule>
 
<IfModule mime_module>
    TypesConfig /etc/mime.types
    #AddType application/x-gzip .tgz
    #AddEncoding x-compress .Z
    #AddEncoding x-gzip .gz .tgz
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-httpd-php .php .html .do
    AddType application/x-httpd-php-source .phps
    AddType text/css .css
    AddType text/javascript .js
    #AddHandler cgi-script .cgi
    #AddHandler type-map var
    #AddOutputFilter INCLUDES .shtml
</IfModule>
 
ErrorDocument 400 /error.php
ErrorDocument 401 /error.php
ErrorDocument 402 /error.php
ErrorDocument 403 /error.php
ErrorDocument 404 /error.php
ErrorDocument 405 /error.php
ErrorDocument 408 /error.php
ErrorDocument 500 /error.php
ErrorDocument 501 /error.php
ErrorDocument 502 /error.php
ErrorDocument 503 /error.php
 
# 보안 검증 통과를 위해 반드시 서버 정보 노출 방지 해야 함.
ServerTokens Prod
ServerSignature Off 
 
TraceEnable Off
 
# Apache HTTPOXY 취약점 방지
RequestHeader unset Proxy early
 
저장하고 나온다.
 
#####################################################################
# php.ini 환경 설정
#####################################################################
vi /etc/php.ini
short_open_tag = On
;경로 기반의 공격 방지
cgi.fix_pathinfo=0
 
;PHP 버전 정보 노출 방지(Hide PHP Version Number)
expose_php = Off
 
post_max_size = 20M  ;// 8M 으로 되어 있었음.
upload_max_filesize = 18M ;// 기본 2M 으로 되어 있었음
 
date.timezone ="Asia/Seoul"
 
 
;PHP에서 세션은 일단 생성 된 뒤에, 가비지 콜렉터 관리로직에 의해 소멸된다.
session.gc_probability = 1
session.gc_divisor = 1
;이값이 100이면 1/100 즉 1%의 확률로 가비지콜렉션이 실행된다.
;1이면 정확하게 유효기간이 넘은 데이타가 삭제될 것이다.
session.gc_maxlifetime = 3600
 
# 저장하고 나온다.
 
# Apache 서버 재기동
systemctl restart httpd
 
# 서버 정보 확인
# ip addr 로 IP 주소 정보를 확인하고 해당 IP주소로 대체하여 입력
curl -192.168.1.20
 
# Apache 라는 서버 정보가 보인다. 이것마저 방지하고자 한다면....
dnf install mod_security
 
vi /etc/httpd/conf/httpd.conf
<IfModule security2_module>
   SecRuleEngine on
   ServerTokens Full
   SecServerSignature "Link2me"
</IfModule>
 
저장하고 나온다.
 
# Apache 서버 재기동
systemctl restart httpd
 
# 서버 정보 확인
curl -192.168.1.20
 
#####################################################################
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
 
# PHP-FPM 구성
vi /etc/php-fpm.d/www.conf
user = apache
group = apache
 
listen = /run/php-fpm/www.sock
 
listen.owner = apache
listen.group = apache
listen.mode = 0660
 
;shift + G 눌러서 제일 하단으로 이동하여
php_value[opcache.file_cache] = /var/lib/php/opcache  ; 주석만 제거
 
저장하고 나온다.
 
vi /etc/httpd/conf.d/php-fpm.conf
 
<FilesMatch \"\.php$\">
    SetHandler \"proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/\"
</FilesMatch>
 
확인하고 틀리면 수정/저장하고 빠져나온다.
 
sudo systemctl restart httpd
sudo systemctl restart php-fpm
 
#####################################################################
# 반드시 추가구현해야 문제없이 동작한다.
cd /var/www/html/
vi .htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ error.php?/$1 [QSA,PT,L]
</IfModule>
 
 
## 보안설정
sudo chmod 640 /etc/httpd/conf/httpd.conf
sudo chown root:root /etc/httpd/conf/httpd.conf
sudo chmod 640 /etc/php.ini
sudo chown root:root /etc/php.ini
 
sudo chown -R apache:apache /var/www/html
sudo chmod -755 /var/www/html
 
####################################################################################
# CentOS7 과 달리 chmod 644 를 지정해줘야 제대로 동작되는 걸 확인했다.
mkdir -/home/rsa/key/
cd /home/rsa/key/
openssl genrsa -out rsa_pri.pem 2048
openssl rsa -pubout -in rsa_pri.pem -out rsa_pub.pem
# Rockey Linux 9 에서 읽기가 관리자권한만 가능하게 되어 있어서 수정해서 해결했다.
# 이 한줄 때문에 숱한 버그 찾기 끝에 해결했다.
chmod 644 rsa_pri.pem
 
# 세션이 저장되는 디렉토리 퍼미션 지정
sudo chmod 777 -/var/lib/php/session
 
sudo chmod 1733 /var/lib/php/session
sudo chown apache:apache /var/lib/php/session
 
# 세션 확인
cd /var/lib/php/session
ll
 
# Clear Old Sessions
sudo rm -rf /var/lib/php/session/*
 
####################################################################################
# 방화벽 데몬 시작
systemctl start firewalld
 
# 서버 부팅 시 firewalld 데몬 자동 시작 설정
systemctl enable firewalld
 
firewall-cmd --permanent --add-service=http 
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-service=mysql
firewall-cmd --permanent --zone=public --add-port=3306/tcp
 
firewall-cmd --permanent --zone=public --add-port=8000/tcp
firewall-cmd --reload
firewall-cmd --list-all
 
#######################################################################
 
cd /var/www/html
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip
unzip phpMyAdmin-5.2.1-all-languages.zip
chown -R apache:apache phpMyAdmin-5.2.1-all-languages
mv phpMyAdmin-5.2.1-all-languages pma
cd pma
cp -rp config.sample.inc.php  config.inc.php
 
# 환경 설정
vi config.inc.php
 
$cfg['blowfish_secret'= 'qtdRoGmbcr]0s)r$9b_JUnoGmbcbcr]0s)r$9b_JUnoGmr]0s)r$9b{~Xz'// 임의의 값 설정
$cfg['Servers'][$i]['host'= 'localhost';
$cfg['Servers'][$i]['compress'= true;
$cfg['TempDir'= '/tmp';
 
 
###############################
###### composor 설치 #####
###############################
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer -V
export COMPOSER_ALLOW_SUPERUSER=1
composer -V
echo "export COMPOSER_ALLOW_SUPERUSER=1" >> ~/.bashrc
cat ~/.bashrc | grep export
 
composer require phpoffice/phpspreadsheet
 
composer require phpmailer/phpmailer
####################################################################################
# 기본 버전을 설치하고 싶다면 아래와 같이 제거 후에 재설치
dnf remove php
 
# 제거후에는 반드시 Reset 해야 한다.
dnf module reset php
 
# 8.2로 활성화
dnf module enable php:8.2
 
# 재설치 진행
dnf install php
####################################################################################
# 서버가 지원하는 TLS 버전 확인 코드
 
<?php
  $ch = curl_init('https://www.howsmyssl.com/a/check'); 
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
  $data = curl_exec($ch); 
  curl_close($ch); 
  $json = json_decode($data); 
  echo "<h1>Your TLS version is: " . $json->tls_version . "</h1>\n";
?>
####################################################################################
 

 

위 환경 설정 httpd.conf 및 php.ini 에는 보안검증 받으면서 지적사항 해결에 사용한 것도 같이 포함되어 있다.

728x90
블로그 이미지

Link2Me

,