Special:Communication & Concept/프리비에스디(FreeBSD 12.0)에 웹서버 Apache 2.4, MariaDB 10.2.X, PHP 7.3.X, Let's Encrypt 인증서, 웹 프로토콜(Web's protocol) HTTP/2 에 미디어위키 설치

Jump to: navigation, search
#181 [ Ssam ] hit: 246(#09ff09) 1 4

Template:TOC right

들어가기

  • 프리비에스디(FreeBSD 12.0)에 웹서버 Apache 2.4.X, MariaDB 10.2.X, PHP 7.3.X, Let's Encrypt 인증서, 웹 프로토콜(Web's protocol) HTTP/2에 미디어위키 설치
  • FreeBSD와 ubuntu 서버 설정을 거의 같은 설정을 해 놓고 속도 비교, FreeBSD가 아주 빠르게 실행된다. (문서도 많이 없고, 설정이 많이 불편 하지만 기대해 봅니다. 어찌하겠나 빠른걸~~)
  • nginx와 Apache 속도? nginx는 404로 넘기는 부분이 많아서.... -_-/

FreeBSD 포트 컬렉션 설치와 업데이트

  • 위에서 실행하지 않았다면 실행
# portsnap fetch
# portsnap extract
# portsnap fetch update
  • 두 번째 부터 실행시 portsnap update 업데이트.
# portsnap fetch
# portsnap update
  • FreeBSD 패키지 업데이트 와 업그레이드
# pkg update
# pkg upgrade


프리비에스디(FreeBSD 12.x) 한글 설정

  • 미디어위키에 봇을 돌려 특정부분를 한글로 치환해야되는 경우가 있어서 설정 함.
  • 두 개 파일 /etc/login.conf/etc/profile 설정하면 된다. (시스템 전체 설정.)
  • 에디터 vi /etc/login.conf 파일을 열어 추가 (84라인 쯤에, 러시아어가 설정되어있는 것을 아래와 같이 변경)
korean|Korean Users Accounts:\
    :charset=UTF-8:\
    :lang=ko_KR.UTF-8:\
    :tc=default:
  • 에디터 vi /etc/profile 파일을 열어 추가 ( 20라인 쯤에)
LANG=ko_KR.UTF-8; export LANG
MM_CHARSET=UTF-8; export MM_CHARSET
  • 파일 /etc/login.conf 재작성 후 디비 업데이트 명령 실행.
# cap_mkdb /etc/login.conf
  • 재부팅
# reboot
  • 로케일 확인
# locale
메세지 출력
LANG=ko_KR.UTF-8
LC_CTYPE="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_ALL=


Apache 2.4 설치

  • Apache 최신 패키지 검색
# pkg search apache
메세지 apache24
apache24-2.4.37 Version 2.4.x of Apache web server


  • Apache 2.4 설치 ( 패키지로 설치해도 HTTP/2 지원 된다.)
# pkg install apache24
메세지 출력, y를 입력하면 설치된다.
New packages to be INSTALLED:
apache24: 2.4.37
libnghttp2: 1.35.1
apr: 1.6.5.1.6.1_1
db5: 5.3.28_7
.........
Proceed with this action? [y/N]: y
또는
# cd /usr/ports/www/apache24/ && make install clean
Proceed with this action? y
.........
설치 후 출력되는 메세지를 잘 읽어 보면 /etc/rc.conf 파일에 apache24_enable="YES" 추가 하라고 나온다, vi로 열어서 추가해도 되고, 아래 명령으로도 추가 된다.
# sysrc apache24_enable=YES
  • 아파치 재시작
# service apache24 restart
  • 웹브라우저 주소 줄에 아이피 주소 넣으면 이런 메세지가 보이면 정상이다.
http://192.168.0.35
It works!
  • 웹 루트는 /usr/local/www/apache24/data 디렉토리 이다.


MariaDB 설치(Install MariaDB on FreeBSD)

  • 데이터 베이스는 개인 취향에 맞는거로 1개만 설치하면 된다.
  • 최신 버전을 설치하기 위해서 설치 전 검색
# pkg search maria
메세지 출력 최신 버전 클라이언트 서버
[......]
mariadb102-client-10.2.19_2 Multithreaded SQL database (client)
mariadb102-server-10.2.19_2 Multithreaded SQL database (server)
mariadb103-client-10.3.11_2 Multithreaded SQL database (client)
mariadb103-server-10.3.11_2 Multithreaded SQL database (server)
[.......]


  • 여기서는 mariadb102를 설치 한다.
# pkg install mariadb102-server
메세지 출력, y를 입력하면 필요한 팩키지들이 설치된다.

[.........]

New packages to be INSTALLED:
mariadb102-server: 10.2.19_2
libedit: 3.1.20170329_2,1
unixODBC: 2.3.7
mariadb102-client: 10.2.19_2

[.........]

Proceed with this action? [y/N]: y
메세지에 디비 설정 관련 메세지가 출력된다.
  • db설정 파일 만들기 /usr/local/share/mysql/my-medium.cnf 샘플 파일을 /usr/local/etc/my.cnf 파일로 복사하여 만든다.
  • db 샘플 파일은 /usr/local/share/mysql/ 디렉토리에 여러개(my-innodb-heavy-4G.cnf, my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf, 이중에서 선택하면 된다.)
서버 메모리에 따라 선택 한다.
  1. my-innodb-heavy-4G.cnf: 4G (innodb 사용)
  2. my-huge.cnf: 1~2G
  3. my-large.cnf 512M
  • MariaDB 설정 파일 my.cnf를 /usr/local/etc/ 이 디렉토리로 복사한다.
# cp /usr/local/share/mysql/my-innodb-heavy-4G.cnf /usr/local/etc/my.cnf
  • 에디터 vi /etc/rc.conf 파일을 열어 mysql_enable="YES"을 추가해도 되고, 아래 명령으로 추가해도 된다.
# sysrc mysql_enable=YES
  • db 서버 시작
# service mysql-server start
  • mysql 암호 설정
# mysql_secure_installation
메세지 출력
Enter current password for root (enter for none): 현재 암호 공백이므로 그냥 엔터
Set root password? -> y
New password: 루트 암호
Re-enter new password: 다시 한번 루트 암호
Remove anonymous users? -> y
Disallow root login remotely? -> y
Remove test database and access to it? -> y
Reload privilege tables now? -> y
  • db 서버 재시작
# service mysql-server restart


FreeBSDphp 설치(Install php on FreeBSD)

  • 최신 php 패키지 찾기
# pkg search php
메세지 출력
[...............]
php72-7.2.10 PHP Scripting Language
php72-Ice37-3.7.1 Modern alternative to object middleware such as CORBA/COM/DCOM/COM+
php72-aphpbreakdown-2.2.2 Code-Analyzer for PHP for Compatibility Check-UP
php72-aphpunit-1.6 Testing framework for unit tests
php72-bcmath-7.2.10 The bcmath shared extension for php
php72-bsdconv-11.5.0 PHP wrapper for bsdconv
[................]


  1. mediawiki를 설치 할 예정 이므로 관련된 확장 모듈 설치.(mediawiki, 기타, 설치를 위한 모듈, 캐쉬 부분...)
  2. mediawiki 1.31.x 설치시 요구사항
  3. ctype, iconv, json, mbstring, xml, 캐쉬확장(php73-pecl-APCu) 선택사항, 기타
  4. Apachemod_php 또는 php-fpm 중에서 php-fpm 을 사용 하기로 함.


  • 필요한 것 확인 후 추가 한다.
# pkg install php73 php73-mysqli php73-mbstring php73-gd php73-curl php73-json php73-zip php73-imap php73-iconv php73-xml php73-sockets php73-openssl php73-session php73-hash php73-ctype php73-xmlwriter php73-xmlreader php73-dom php73-simplexml php73-posix php73-tokenizer php73-fileinfo php73-intl php73-bz2 php73-gettext php73-composer php73-pecl-APCu


  • php.ini-production 파일을 /usr/local/etc/ 디렉토리에 복사 한다.
# cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
  • 에디터 vi /etc/rc.conf 파일을 열어 php-fpm_enable="YES"을 추가해도 되고, 아래 명령으로 추가해도 된다.
# sysrc php_fpm_enable=YES
  • php-fpm 스크립트 서비스 시작
# service php-fpm start

php-fpm 스크립트 환경 설정(Configuring php-fpm)

  • 설정 파일 vi /usr/local/etc/php-fpm.d/www.conf 파일을 열어 수정, 추가 해 준다.
  • 36라인 쯤에 주석 처리하고 바로 아래에 listen = /var/run/php-fpm.sock 를 추가 한다.(Unix 소켓 사용시 참고)
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm.sock
  • 48,49,50 라인에 주석 제거
listen.owner = www
listen.group = www
listen.mode = 0660
  • 391라인쯤에 추가
security.limit_extensions = .php .html
# service php-fpm restart


아파치(apache 2.4) 설정

  • Apache 2.4 설정 파일 vi /usr/local/etc/apache24/httpd.conf 파일을 열어 수정, 추가해 준다.
216 라인에 ServerAdmin 관리자 메일 주소를 수정 한다.
ServerAdmin ssam@mysam.net
225 라인에 ServerName 수정 (외부로 연결된 사설 아이피)
ServerName 192.168.0.35:80
283 라인에 DirectoryIndex index.html 이렇게 된것을 아래와 같이 index.php 추가
<IfModule dir_module>
  DirectoryIndex index.php index.html
</IfModule>
538 라인(맨끝 라인)에 Include etc/apache24/Includes/*.conf 줄 밑에 추가 해 준다.( /usr/local/etc/apache24/Includes/ 이 디렉토리에 파일을 만들어서 추가 해도 됨)
Include etc/apache24/Includes/*.conf

<FilesMatch "\.php$">
    # SetHandler "proxy:fcgi://127.0.0.1:9000"
    ##Unix sockets require 2.4.7 or later
    SetHandler "proxy:unix:/var/run/php-fpm.sock|fcgi://localhost/"
</FilesMatch>
프록시 관련 아파치 웹사이트 글 참조.
유닉스 소켓 관련 아파치 웹사이트 글 참조.


  • php-fpm 사용하기 위해서 129, 133라인에 주석 해제
LoadModule proxy_module libexec/apache24/mod_proxy.so
LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
  • 아파치 재시작.
# service apache24 restart


  • info.php 파일을 만들어 확인 한다.
# vi /usr/local/www/apache24/data/info.php
파일을 열어 추가
<?php
    phpinfo();


  • 웹브라우저 주소 줄에 아이피 주소 넣어 정보가 보이면 정상 이다.
http://192.168.0.35/info.php
확인 한 후 삭제 한다.
# rm /usr/local/www/apache24/data/info.php
메인 웹 디렉토리 위치는 /usr/local/www/apache24/data 가 된다.
여기에 웹페이지를 만들어 놓으면 된다.


가상 호스트 설정

  1. 여기서는 메인 웹 루트가 /usr/local/www/apache24/data/ 이지만 사용하지 않는다.
  2. 사용자 디렉토리를 사용 하면서 가상 호스트로 설정.
  3. 아파치 설정 파일 vi /usr/local/etc/apache24/httpd.conf 를 열어 주석 해제
172 라인 주석 해제
LoadModule vhost_alias_module libexec/apache24/mod_vhost_alias.so
178 라인 주석 해제
LoadModule userdir_module libexec/apache24/mod_userdir.so
502 라인 주석 해제
Include etc/apache24/extra/httpd-userdir.conf
508 라인 주석 해제
Include etc/apache24/extra/httpd-vhosts.conf
  • 설정을 저장 한다.
  • 이 샘플 파일 vi /usr/local/etc/apache24/extra/httpd-userdir.conf 을 열어 모두 지우고 이렇게 설정 한다.
  1. httpd-userdir.conf 파일 열어 보면 요구되는 모듈이 보인다.
  2. 모듈 mod_authz_core, mod_authz_host, mod_userdir 를 요구한다.
  3. mod_authz_core, mod_authz_host 두개는 기본적으로 해제되어 있다.
아래와 같이 설정
<IfModule mod_userdir.c>
       UserDir www/html
       UserDir disabled root

       <Directory /usr/home/*/www/html>
#               AllowOverride FileInfo AuthConfig Limit Indexes
#               Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
               AllowOverride All

               <Limit GET POST OPTIONS>
                       Require all granted
               </Limit>
               <LimitExcept GET POST OPTIONS>
                       Require all denied
               </LimitExcept>
      </Directory>
</IfModule>


  • 이 샘플 파일 vi /usr/local/etc/apache24/extra/httpd-vhosts.conf 을 열어 수정 한다.(여기에 여러개 설정하여 여러개의 웹사이트를 구성 할 수 있다.)
  • 테스트 설정 사설 아이피 설정 부분은 테스트 후 제거 한다.
  • 이 항목 NameVirtualHost *:80 이름 기반 가상 호스트 효과 없어 제거 된다고 에러 뿜어 된다.


 # Test ip setup
 <VirtualHost *:80>
    ServerAlias 192.168.0.35
    ServerName 192.168.0.35
    ServerAdmin ssam@mysam.net
    DocumentRoot "/usr/home/테스트계정/www/html"
 </VirtualHost>

 <VirtualHost *:80>
    ServerAlias *.mysam.net 
    ServerName mysam.net
    ServerAdmin ssam@mysam.net
    DocumentRoot "/usr/home/사용자/www/html"

    # SSL certificate
    Redirect permanent / https://mysam.net/
 </VirtualHost>

 <VirtualHost *:80>
    ServerAlias *.zbm.kr 
    ServerName zbm.kr 
    ServerAdmin ssam@zbm.kr 
    DocumentRoot "/usr/home/사용자/www/html"
 
    # SSL certificate  
    Redirect permanent / https://zbm.kr/
 </VirtualHost>


사용자 디렉토리 만들고 퍼미션 조정

  • 사용자가 추가되어있지 않다면 사용자 추가, 여러 사용자를 추가 구성 할 수 있다.
# adduser
  1. 메세지 출력에 대하여
  2. Username은 사용자 계정을 적어다 준다, Full name은 그냥 넘겨도 됨.
  3. Login group is due. Invite due into other groups? [], 물음에 일반 사용자면 엔터, 관리자면 wheel그룹에 가입.
메세지 출력 예 입니다.
 Username: lure
 Full name: 
 Uid (Leave empty for default): 
 Login group [lure]: 
 Login group is lure. Invite lure into other groups? []: wheel
 Login class [default]: 
 Shell (sh csh tcsh nologin) [sh]: 
 Home directory [/home/lure]: 
 Home directory permissions (Leave empty for default): 
 Use password-based authentication? [yes]: 
 Use an empty password? (yes/no) [no]: 
 Use a random password? (yes/no) [no]: 
 Enter password: 
 Enter password again: 
 Lock out the account after creation? [no]: 
 Username   : lure
 Password   : *****
 Full Name  : 
 Uid        : 1002
 Class      : 
 Groups     : lure wheel
 Home       : /home/lure
 Home Mode  : 
 Shell      : /bin/sh
 Locked     : no
 OK? (yes/no): yes
 adduser: INFO: Successfully added (lure) to the user database.
 Add another user? (yes/no): no
 Goodbye!
  • 참고로 사용자 삭제 명령은
# rmuser
  • 디렉토리 만들기
# cd ~
# mkdir -p /usr/home/ssam/www/html
  • 퍼미션 조정
# chmod -R 755 /usr/home/ssam/www/html
  • 그룹 변경: 소유자:소유자 그룹
# chown -R ssam:ssam /usr/home/ssam/www/html
  • 아파치 재시작
# service apache24 restart
  • 이제 메인 웹 루트가 변경 됬다. (사용자 계정으로 사용하기 위해서...)
/usr/home/*/www/html
퍼미션 조정하고 웹페이지를 만들어 놓으면 된다, 기본 퍼미션은 755 이다.


php 7.3 파일 업로드 사이즈 조정(cloud 설치)

  • 클라우드 설치 대비, upload_max_filesize 2000M, post_max_size 2001M, max_execution_time, max_input_time는 10배로, memory_limit는 2배로
  • 이 파일 vi /usr/local/etc/php.ini 을 열어 수정 한다.
383라인쯤에
max_execution_time = 600
393라인쯤에
max_input_time = 1200
404라인쯤에, nextcloud 권고 사항 512M.
memory_limit = 1024M
690라인쯤에
post_max_size = 4001M
842라인쯤에
upload_max_filesize = 4000M
이 부분을 찾아서 적당한 크기로 수정해 준다.
796라인쯤에 주석 해제 (nextcloud 권고 사항)
cgi.fix_pathinfo=1
allow_url_fopen = off
  • nextcloud 설치시 추천된 설정(Enable PHP OPcache)
1798 라인 쯤에 있다, 아래와 같이 주석을 해제하고 수정하면 된다.
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=1
opcache.save_comments=1
# service php-fpm restart


phpMyAdmin 설치

  • make clean 은 이전 컴파일 내용을 삭제, make distclean 은 파일을 받고 압축을 푼 처음 상태로 만드는 것.
  • 현재 포트 컴파일 phpMyAdmin 패기지는 4.8.4.버전이 설치된다.
# cd /usr/ports/databases/phpmyadmin && make config-recursive install distclean


모두 설치된 다음 메세지 출력, Apache version 2.4 상위 버전은 아래와 같이 추가 하라고 나온다.
For Apache version 2.4.x or above:
Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"

    <Directory "/usr/local/www/phpMyAdmin/">
        Options None
        AllowOverride Limit

        Require local
        Require host .example.com
    </Directory>
  • 아파치 설정 파일 vi /usr/local/etc/apache24/httpd.conf 를 열어 아래와 같이 추가해 준다.(533라인 쯤에 추가, 맨끝.)
  • 참고 이 설정은 .htaccess 파일을 /usr/local/www/phpMyAdmin 디렉토리에 넣어 특정 사용자만 접속 가능하게 할 수 있다.
Alias /phpmyadmin "/usr/local/www/phpMyAdmin"
<Directory "/usr/local/www/phpMyAdmin">
   Options None
   AllowOverride all
   Require all granted
</Directory>


  • config.inc.php 복사
# cp /usr/local/www/phpMyAdmin/config.sample.inc.php /usr/local/www/phpMyAdmin/config.inc.php


  • 심볼링크로 /usr/local/www/apache24/data/ 웹루트 디렉토리에 링크를 건다.
# ln -s /usr/local/www/phpMyAdmin/ /usr/local/www/apache24/data/phpmyadmin
  • 아파치 재시작
# service apache24 restart
  • 웹브라우저 주소창에 아래 주소넣고 확인 해본다.
http://192.168.0.35/phpmyadmin


phpMyAdmin 에 config.inc.php 설정

  • 로그인 하면 하단에 $cfg['blowfish_secret']항목이 뜬다. 적당히 넣어 주면 된다.
이 파일 vi /usr/local/www/phpMyAdmin/config.inc.php 을 열어 넣어주면 된다.
17라인에
$cfg['blowfish_secret'] = '암호(@_@)6/3=2를-적어*놓으시오_쿠키에-필요=하다고^하니!'; 

.htaccess 파일 사용하기

  • .htaccess 파일을 사용하기 위해서 위에서 AllowOverride All 로 설정 했다.
  • 아파치 설정 파일 vi /usr/local/etc/apache24/httpd.conf 를 열어 주석 해제 한다.
180 라인 쯤에 주석 해제
LoadModule rewrite_module libexec/apache24/mod_rewrite.so
  • 아파치 재시작
# service apache24 restart


phpMyAdmin의 .htaccess 엑세스 제어로 특정 IP 만 접속 가능

  • .htaccess 엑세스를 사용하기위한 준비는 다됬고 특정 디렉토리 또는 기능 각각 제어 해 보기.
  • phpMyAdmin 제어 모든 IP는 막히고 그중 사설 아이피 중에 몇 개만 접속 가능하게 제어하여 본다.
  • 에디터로 vi /usr/local/www/phpMyAdmin/.htaccess 파일을 열어 처음 열면 아무것도 없음 아래와 같이 작성 해 준다.
SetEnvIf remote_addr 192.168.0.1 go_in
SetEnvIf remote_addr 192.168.0.2 go_in
SetEnvIf remote_addr 192.168.0.3 go_in
SetEnvIf remote_addr 192.168.0.4 go_in
SetEnvIf remote_addr 192.168.0.5 go_in
SetEnvIf remote_addr 192.168.0.6 go_in
  
Order deny,allow
deny from all
allow from env=go_in
  1. 192.168.0.1/4 이이피를 가지는 컴에서, http://192.168.0.35/phpmyadmin/로 설정된 서버에 접속 해 본다.(192.168.0.35 사설 아이피는 외부로 연결되어 있음.)
  2. http://mysam.net/phpmyadmin/ 도메인으로 접속 해본다,외부 또는 내부 192.168.0.10 아이피를 같는 컴, 접속이 안 되면 정상이다.
  3. http://192.168.0.35/phpmyadmin/ 사설 내부 192.168.0.1 아이피를 사용하는 컴퓨터는 접속 된다.
  4. http://192.168.0.35/phpmyadmin/ 사설 내부 192.168.0.2 아이피를 사용하는 컴퓨터는 접속 된다.
  5. http://192.168.0.35/phpmyadmin/ 사설 내부 192.168.0.3 아이피를 사용하는 컴퓨터는 접속 된다.
  6. http://192.168.0.35/phpmyadmin/ 사설 내부 192.168.0.4 아이피를 사용하는 컴퓨터는 접속 된다.
  7. [ ...........]
  8. 그 이외에 아이피들은
Forbidden
You don't have permission to access /phpmyadmin/ on this server.
이런 메세지들을 만나게 된다, 그러니까 외부에서는 접속 불가이고 내부 망에서도 특정 아이피만 접속 된다.


미디어위키 설치

  • SVG 이미지 지원하기위해 Inkscape를 설치하지 않았다면, 먼저 설치 한다.

미디어위키 다운로드

  • 다운로드된 파일을 계정에 업로드한다
  • 사용자 계정에서 디렉토리로 이동 후 압축 해제
# cd /usr/home/ssam/www/html
# tar xvzf mediawiki-1.31.*.tar.gz
  • 디렉토리를 wiki로 변경(디렉토리 이름은 정확히 써 주어야 된다.)
# mv mediawiki-1.31.3 wiki
  • 압축된 파일 삭제
# rm -f mediawiki-1.31.*.tar.gz
  • 그룹 변경: 소유자:소유자 그룹
# chown -R ssam:ssam /usr/home/ssam/www/html/wiki
# chmod 755 /usr/home/ssam/www/html/wiki
  • 권한 변경 참고
디렉토리만 권한 변경
# find /usr/home/ssam/www/html/wiki -type d -print0 | xargs -0 chmod 755 
파일만 권한 변경
# find /usr/home/ssam/www/html/wiki -type f -print0 | xargs -0 chmod 644
  • 파일 권한 확인
# cd /usr/home/ssam/www/html/wiki
파일 권한 보기
~/usr/home/ssam/www/html/wiki # ls -al


  • 웹브라우저에서 설치
http://mysam.net/wiki
미디어위키 설치시 캐쉬를 설정하여 설치 한다, 로딩 속도가 10배는 빨라진다.
캐쉬 설정 방법은 아래 미디어위키 관련글을 참고
  • 미디어위키 설치 후 사용자 조정
  • 파일의 소유자와 그룹을 변경, php스크립트로 특정 디렉토리 또는 파일의 퍼미션을 조정하려면 소유자와 소유그룹을 데비안 계열은 www-data로 변경, FreeBSD 계열은 www로 변경 해야 php 스크립트로 특정 디렉토리를 원하는데로 퍼미션 조정을 할 수 있다.
  • 캐쉬 디렉토리와 파일의 소유자를 변경
# chown -R www:ssam /usr/home/ssam/www/html/wiki/cache
  • 이미지 디렉토리와 파일의 소유자를 변경
# chown -R www:ssam /usr/home/ssam/www/html/wiki/images
참고로 모든 디렉토리의 퍼미션은 755, 모든 파일의 퍼미션은 644 가 된다.


웹 페이지에 .htaccess 엑세스 제어로 특정 IP들 만 접속 제한

  1. 가장 좋은 방법은 막지않는 것 입니다.
  2. 웹 루트는 가상 호스트 사용자로 /usr/home/ssam/www/html 로 설정되어 있다.
  3. /usr/home/ssam/www/html 아래로 여러 프로그램들이 설치되어 있다.
  4. 특정 아이피 막어보자.
  5. http://httpd.apache.org/docs/2.0/ko/mod/mod_setenvif.html#setenvif 아파치 모듈 mod_setenvif 참조.
  6. SetEnvIfNoCase remote_addr 접속이 안되는 것이 아니라 403 Forbidden 을 호출함.
  7. SetEnvIf를 사용하지 않고 SetEnvIfNoCase 사용한 경우는 대소문자를 가리지 않는다.
  • 에디터로 열어 엑세스 파일을 작성해준다.
# vi /usr/home/ssam/www/html/.htaccess
  • .htaccess 파일의 내용
# 특정사용자별로 환경 설정을 할 수도 있다.
# PHP_VALUE mysql.default_charset UTF8
 
SetEnvIfNoCase remote_addr XX.XX.XXX.XX go_out
SetEnvIfNoCase remote_addr XXX.XX.*.* go_out
Order Allow,deny
Deny from env=go_out
Allow from all
참고로 XX.XX.XXX.XXX 이런 아이피 막음, 대량으로 막을때는 XXX.XX.*.* 이런식으로~.


FreeBSD 12.x 에 certbot 설치

포트 컴파일로 certbot 설치
# cd /usr/ports/security/py-certbot && make install clean
패키지로 certbot 설치
# pkg install py36-certbot


FreeBSD 12.x 에 Let's Encrypt 인증서 설치

  • /usr/home/ssam/www/html 웹페이지가 설치된 경로, zbm.kr, www.zbm.kr 인증서가 적용될 도메인
Template:Del
  • 와일드카드 인증서 (Wildcard Certificate) 설치 방법
2018/3/13일 부터 DNS의 TXT 레코드를 이용하는 방식으로 지원한다.
  • 봇 버전 확인 : 0.22.0 이상 부터 지원한다.
# certbot --version
certbot 0.25.1 출력됨. (현재 FreeBSD 12.0버전, php 7.3, 기타 사용 함)
  • 보안을 위해서 이 옵션 --rsa-key-size 4096을 사용하면 4096 bit가 만들어 지나 속도 5~10배 정도 느려진다.


# certbot certonly --manual --email 이메일주소 --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d 'zbm.kr,*.zbm.kr'


-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for zbm.kr
dns-01 challenge for zbm.kr

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.zbm.kr with the following value:

XXXUdTqbrGhL9us~   //첫번째로 이 부분을 복사하여 DNS 관리하는곳에 붙여넣고 생성

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.zbm.kr with the following value:

XXXXXXXXXXXXXXXXXXXXXUEXbU03B~ //두번째로 이 부분을 복사하여 DNS 관리하는 곳에 붙여 넣고 생성

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

이 메세지가 나오면 Before continuing, verify the record is deployed.(계속하기 전에 레코드가 베포되었는지 확인 하라는 메세지)

여기서 엔터치지 말고 DNS 관리하는 곳에 가서 TXT 관리(텍스트) 부분에서 생성

도메인: _acme-challenge.zbm.kr           텍스트(TXT):    XXXUdTqbrGhL9us~ 
도메인: _acme-challenge.zbm.kr           텍스트(TXT):    XXXXXXXXXXXXXXXXXXXXXUEXbU03B~ 

이렇게 만드신 후 ....

TXT 레코드를 정확하게 생성했으면 TXT 레코드가 반영되도록(5~10분)어느 정도 시간을 기다린 뒤, Press Enter to Continue 메시지 엔터를 치면 인증서 설치를 한 후 메세지 출력.


Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /usr/local/etc/letsencrypt/live/zbm.kr-~~~~~/fullchain.pem
   Your key file has been saved at:
   /usr/local/etc/letsencrypt/live/zbm.kr-~~~~/privkey.pem
   Your cert will expire on 2018-11-17. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /usr/local/etc/letsencrypt. You should
   make a secure backup of this folder now. This configuration
   directory will also contain certificates and private keys obtained
   by Certbot so making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

  • 환경설정하라는 메세지 출력됨
  1. /usr/local/etc/letsencrypt/live/zbm.kr 에 실제 인증서가 설치된다.
  2. /usr/local/etc/letsencrypt/live/zbm.kr 에 cert.pem, fullchain.pem, chain.pem, privkey.pem 4개의 파일이 생성된다.(리뉴얼시 파일 이름은 변경된다.)
  3. 4개파일을 USB에 백업받아 둔다.

Diffie–Hellman

  • Diffie–Hellman 생성
# mkdir -p /etc/ssl/certs
# chmod 400 /etc/ssl/certs
# openssl dhparam -out /etc/ssl/certs/dhparam_4096.pem 4096
  • Diffie–Hellman 설정
  • /usr/local/etc/apache24/extra/httpd-ssl.conf 파일에 추가 한다.
SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam_4096.pem"


FreeBSD 12.x 에서 아파치 Let's Encrypt 인증서 설정

  • 아파치에 SSL 인증서 적용하기 vi /usr/local/etc/apache24/httpd.conf 파일을 열어서 주석 해제 한다.
73 라인에 주석 해제
LoadModule authn_socache_module libexec/apache24/mod_authn_socache.so
89 라인에 주석 해제
LoadModule cache_module libexec/apache24/mod_cache.so
91 라인에 주석 해제
LoadModule cache_socache_module libexec/apache24/mod_cache_socache.so
92 라인에 주석 해제
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
148라인 쯤에 주석 해제
LoadModule ssl_module libexec/apache24/mod_ssl.so
525라인 쯤에 주석 해제
Include etc/apache24/extra/httpd-ssl.conf
모두 변경 후 저장 한다.


FreeBSD 12.x 에서 SSL 인증서 환경 설정 파일 설정

  • 이 위치 vi /usr/local/etc/apache24/extra/httpd-ssl.conf 에 파일을 열어 모두 지우고 아래와 같이 수정 한다.
  • TLSv1.3 지원은 OpenSSL 1.1.1 이후 버전부터 지원된다, 현재 실험적, ....
  • 이 항목 NameVirtualHost *:443 이름 기반 가상 호스트 설정하니 효과 없어 제거 된다고 에러 뿜어 된다.


 Listen 443
  
 # TLSv1.2, TLSv1.3
 SSLCipherSuite  "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128"
 SSLProxyCipherSuite "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128"
 SSLHonorCipherOrder on
 SSLCompression      off
 SSLSessionTickets   off
  
 #SSL Protocol:
 SSLProtocol -all +TLSv1.2 +TLSv1.3
 SSLProxyProtocol -all +TLSv1.2 +TLSv1.3

 #Pass Phrase Dialog:
 SSLPassPhraseDialog  builtin

 #nter-Process Session Cache:
 SSLSessionCache        "shmcb:/var/run/ssl_scache(512000)"
 SSLSessionCacheTimeout  300
 
 #OCSP Stapling (requires OpenSSL 0.9.8h or later)
 SSLUseStapling On
 SSLStaplingCache  "shmcb:/var/run/ssl_stapling(32768)"
 SSLStaplingStandardCacheTimeout 3600
 SSLStaplingErrorCacheTimeout 600

 # Header Secure
 Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
   
 #Diffie-Hellman
 SSLOpenSSLConfCmd ECDHParameters secp384r1
 SSLOpenSSLConfCmd Curves secp521r1:secp384r1
 SSLOpenSSLConfCmd DHParameters  "/etc/ssl/certs/dhparam_4096.pem"

 <VirtualHost *:443>
   Protocols h2 http/1.1
   #General setup for the virtual host
   ServerAlias *.mysam.net
   ServerName mysam.net
   ServerAdmin ssam@mysam.net
   DocumentRoot "/usr/home/사용자/www/html"

   #Security
   <IfModule mod_headers.c>
      Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
      Header always set X-Frame-Options "SAMEORIGIN"
      Header set X-Content-Type-Options "nosniff"
      Header set X-XSS-Protection "1;mode=block"
      Header set Cache-Control "no-store"
      Header set Pragma "no-cashe"
   </IfModule>

   ErrorLog "/var/log/httpd-error.log"
   TransferLog "/var/log/httpd-access.log"

   #SSL Engine Switch:
   SSLEngine on

   #Let's Encrypt add 
   SSLCertificateFile "/usr/local/etc/letsencrypt/live/mysam.net-0011/fullchain.pem"
   SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/mysam.net-0011/privkey.pem"
 
   # HPKP(HTTP Public Key Pinning)

    
   #SSLVerifyClient require
   #SSLVerifyDepth  10
 
   #TLS-SRP mutual authentication:
   #SSLSRPVerifierFile "/usr/local/etc/apache24/passwd.srpv"
 
   <FilesMatch "\.(cgi|shtml|phtml|php)$">
      SSLOptions +StdEnvVars
   </FilesMatch>

   <Directory "/usr/local/www/apache24/cgi-bin">
      SSLOptions +StdEnvVars
   </Directory>

   #"force-response-1.0" for this.
   BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

   #Per-Server Logging:
   CustomLog "/var/log/httpd-ssl_request.log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

 </VirtualHost>                                  

 <VirtualHost *:443>
   Protocols h2 http/1.1
   ServerAlias *.zbm.kr
   ServerName zbm.kr
   ServerAdmin ssam@zbm.kr
   DocumentRoot "/usr/home/사용자/www/html"

   #Security
   <IfModule mod_headers.c>
      Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
      Header always set X-Frame-Options "SAMEORIGIN"
      Header set X-Content-Type-Options "nosniff"
      Header set X-XSS-Protection "1;mode=block"
      Header set Cache-Control "no-store"
      Header set Pragma "no-cashe"
   </IfModule>

   ErrorLog "/var/log/httpd-error.log"
   TransferLog "/var/log/httpd-access.log"

   #SSL Engine Switch:
   SSLEngine on

   #Let's Encrypt add
   SSLCertificateFile "/usr/local/etc/letsencrypt/live/zbm.kr-00011/cert.pem"
   SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/zbm.kr-00011/privkey.pem"
   SSLCACertificateFile "/usr/local/etc/letsencrypt/live/zbm.kr-00011/chain.pem"

   #SSLVerifyClient require
   #SSLVerifyDepth  10

   #TLS-SRP mutual authentication:
   #SSLSRPVerifierFile "/usr/local/etc/apache24/passwd.srpv"

   <FilesMatch "\.(cgi|shtml|phtml|php)$">
       SSLOptions +StdEnvVars
   </FilesMatch>

   <Directory "/usr/local/www/apache24/cgi-bin">
       SSLOptions +StdEnvVars
   </Directory>

   #"force-response-1.0" for this.
   BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

   #Per-Server Logging:
   CustomLog "/var/log/httpd-ssl_request.log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

 </VirtualHost>                         


  • 아파치 재시작
# service apache24 restart 


인증서 갱신(renewal)

  • 인증서 기간이 만료되기전에 갱신
  • /usr/home/ssam/www/html 웹페이지가 설치된 경로, zbm.kr, www.zbm.kr 인증서가 적용될 도메인
# certbot certonly --webroot -w /usr/home/ssam/www/html -d zbm.kr -d www.zbm.kr


자동으로 리뉴얼(Automating renewal)

# certbot renew 
  • 아파치 재시작 해 주어야 갱신된다.
# service apache24 restart


SSL 서버 테스트(SSL Server Test)

  • 여기 ssllabs에 가면 테스트 할 수 있다.


웹 프로토콜(Web's protocol) HTTP/2 적용

66라인에 주석 제거, 67라인에 주석 처리
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
#LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
#LoadModule mpm_worker_module libexec/apache24/mod_mpm_worker.so
150, 151 라인쯤에 주석 제거.
LoadModule http2_module libexec/apache24/mod_http2.so.
LoadModule proxy_http2_module libexec/apache24/mod_proxy_http2.so


  • 이 파일 vi /usr/local/etc/apache24/extra/httpd-ssl.conf 을 열어 추가.
  • h2c : HTTP/2 (without TLS), 현재 인증서 없이 HTTP/2 지원하는 브라우저 없음, Protocols h2 h2c http/1.1
  • 128 라인쯤에 추가, <VirtualHost *:443> 태그 안쪽에 Protocols h2 http/1.1 추가 한다.


 <VirtualHost *:443>
  Protocols h2 http/1.1
  # General setup for the virtual host
 
  [.........]

 </VirtualHost>
  • 아파치 재시작
# service apache24 restart 


웹 프로토콜(Web's protocol) HTTP/2 적용 확인

  • 크롬브라우저에서 메뉴->도구더보기->개발자 도구(Ctrl + shift + i) 클릭하시고, Type항목에 오른쪽 마우스로 프로토콜 선택한 후, 테스트 하고싶은 사이트로 이동하여 트레킹 해보면, 네트워크 부분에서 프로토콜을 확인 할 수 있다.


FreeBSD 업그레이드

  • Updating FreeBSD 참조.
  • 이 파일 vi /etc/crontab 을 열어 크론탭에 등록 한다.
  • DDNS 스크립트 넣어서 돌리면된다. (리눅스에는 안 넣어도 되지만 프리비에스디는 root 항목이 있다, 넣지 않으면 크론이 돌면서 에러를 낸다.)
0	3	*	*	*	root	/usr/sbin/freebsd-update cron
  • 리눅스쪽에는 크론 스크립트에 root 없어도 되지만 FreeBSD 10.3는 넣어 주어야 된다.(없다면 크론이 돌면서 로그인 에러 login_getclass: unknown class 를 발생 시킨다.)
  • 외부접속 고정아이피 DDNS 스크립트 여기에 넣어서 돌리면 잘 돌아 간다.
  • 나머지는 공유기에서 사설 아이피로 고정 잡으면 외부 접속이 잘 된다.


PKG 레포지토리 바꾸기(PKG Repository Changed)

  • 최신 패키지를 사용하고 싶다면 변경할 수 있다.
  • 참고 forums.freebsd.org.
  • FreeBSD 의 기본 레포지토리는 /etc/pkg/FreeBSD.conf 에 저장되어 있다.
  • 새로운 레포지토리 파일을 만들어 그것을 기본으로 사용하게 지정할 수 있다.
  • 사용자 정의 리포지토리의 전통적인 위치, 디렉토리 만들기
# mkdir -p /usr/local/etc/pkg/repos


  • 에디터 vi /usr/local/etc/pkg/repos/FreeBSD.conf 파일을 열어 작성 한다.


FreeBSD: {
 url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
 enabled: yes 
}
  • 패키지 업데이트
# pkg update


로그 확인 하기

  • Apache, httpd-error.log, httpd-access.log, /var/log/httpd-ssl_request.log 참조 누적되므로 관리.
볼수있는 로그목록
/var/log/httpd-error.log
/var/log/httpd-access.log
/var/log/httpd-ssl_request.log
/var/log/cron
/var/log/all.log
/var/log/amd.log
/var/log/auth.log
/var/log/console.log
/var/log/daily.log
/var/log/maillog
/var/log/messages
[.........]
# cat /var/log/cron
# cat /var/log/httpd-error.log
# cat /var/log/httpd-access.log
# cat /var/log/httpd-ssl_request.log
실시간 확인
# tail -f /var/log/httpd-error.log
# tail -f /var/log/httpd-access.log
# tail -f /var/log/httpd-ssl_request.log
# tail -f /var/log/cron
나가기
ctrl+c

로그 관리

  • 설정 파일은 vi /etc/newsyslog.conf 이 위치에 있고 추가 설정은 아래와 같이 만들어서 작성(apache24.conf).
  • /etc/syslog.conf 이 파일을 열어보면 <include> /usr/local/etc/newsyslog.conf.d/* 이런 부분이 있어 파일을 작성하면 자동 포함 시킨다.
  • 디렉토리 만들고
# mkdir -p /usr/local/etc/newsyslog.conf.d/
# chmod -R 644 /usr/local/etc/newsyslog.conf.d/
  • 에디터 vi /usr/local/etc/newsyslog.conf.d/apache24.conf 파일을 만들어 아래와 같이 작성 해 준다.
# Apache24 log setup
# logfilename                    [owner:group]    mode  count  size  when  flags   [/pid_file] [sig_num]
/var/log/httpd-access.log                         640    14     *    @T00   JB     /var/run/httpd.pid 30
/var/log/httpd-error.log                          640    14     *    @T00   JB     /var/run/httpd.pid 30
/var/log/httpd-ssl_request.log                    640    14     *    @T00   JB     /var/run/httpd.pid 30

  • ... 로그 파일은 2주일분(14일) 14개로 회전, @T00은 실제로 자정, 압축, 바이너리 파일, 지정.
  • 생성된 파일은 이런 형식으로 httpd-access.log.0.bz2, ..... 14개 생김.

기타

  • 패키지 관리 참고
# pkg info 설치한 패키지 이름 : 설치한 패키지에 대한 정보를 봅니다.
# pkg remove 설치한 패키지 이름 : 설치한 패키지를 제거 합니다.
# service apache24 restart
# service mysql-server restart
  • php-fpm 스크립트 서비스 재시작
# service php-fpm restart
  • syslogd 서비스 재시작
# service syslogd restart
  1. 설정 파일이 있는 곳 /usr/local/etc/ 이 디렉토리에 모여 있다.
  2. 참고 사항으로 정리.
  3. 이 문서에 오류가 있다면 아래, 계속 업데이트 됩니다.

Template:Quotation


Logo

Edit Reply#183[ Ssam ]

Reply

Option:
 
* CAPTCHA