검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문: How to set up a secure FTP service with vsftpd on Linux

  FTP 자체는 안전한 프로토콜로서 설계된 것이 아니라서 일반 FTP 서비스는 Man in the Middle이나 Brute Force 같은 일반적인 공격에 취약합니다. 그래서 많은 FTP 서버들이 보안 기능을 추가로 사용합니다. 예를 들어 FTPS(FTP Secure)는 SSL/TLS 인증서를 이용해 종단간에 데이터를 암호화합니다. FTPS는 설정에 따라 암호화 연결과 비암호화 연결 중 하나만을 지원하거나 둘 다 지원할 수 있습니다. SFTP(SSH FTP)는 또 다른 보안 방식으로 SSH를 이용하는 형태로 만들어졌으며 다른 보안 프로토콜과 함께 사용할 수 있습니다.

  이 글에서는 SSL/TLS를 활성화한 vsftpd를 이용해 FTP 서비스를 운영하는 법을 설명합니다.

  기본적으로 알고 있어야 하는 것으로 일반적인 FTP 서버는 데이터 전송을 위해 TCP 20번 포트를 열고 있으며 명령어 전송을 위해 21번 포트(컨트롤 포트라고도 부름)를 열고 있습니다. 접속 처리와 명령어 파라미터의 교환은 21번 포트를 통해 이뤄집니다. FTP 접속에는 2가지 방식이 있는데 하나는 액티브 모드이며 다른 하나는 패시브 모드입니다. 액티브 모드로 접속 중일 때는 서버가 자신의 20번 포트(데이터)로부터 클라이언트를 향해 접속을 시도합니다. 패시브 모드로 접속 중일 때는 각 클라이언트 세션을 위한 랜덤 포트를 열어서 그 포트를 클라이언트에게 통보합니다. 그러면 통보를 받은 클라이언트는 서버의 해당 랜덤 포트를 향해 접속을 시도합니다.

  RFC 1635에 따르면 FTP는 패스워드가 필요 없는 anonymous라는 공용 계정, 그리고 ftp라는 패스워드를 가진 ftp라는 공용 계정을 둘 중 하나만 지원할 수도 있고 둘 다 지원할 수도 있습니다. 거기에 더하여 vsftpd는 로컬 계정을 이용한 로그인도 지원합니다. 서버에 등록된 계정으로 접속하면 해당 계정의 홈 디렉토리에 접근할 수 있습니다.

리눅스에 vsftpd 설치
  우분투, 데비안, 리눅스 민트 등에 vsftpd를 설치할 때는 apt-get 명령어를 사용합니다. vsftpd 서비스는 부팅 시 자동으로 실행됩니다.
$ sudo apt-get install vsftpd
  센트OS, 페도라, RHEL 등에 vsftpd를 설치할 때는 yum 명령어를 사용합니다. 서비스 시작과 부팅 시 실행은 아래와 같이 따로 설정해야 합니다.
# yum install vsftpd
# service vsftpd start
# chkconfig vsftpd on
  vsftpd를 사용한 FTP 서비스의 가장 기본적인 준비는 이것으로 끝입니다. 브라우저에서 ftp://[서버이름/IP] 라는 형태로 접속할 수도 있고 FileZilla 같은 FTP 클라이언트를 이용해서 패스워드 없이 anonymous라는 계정명을 사용하거나 계정명과 패스워드 모두 ftp를 사용하여 접속할 수도 있습니다.

  vsftpd가 설치되면 홈 디렉토리가 /var/ftp인 ftp라는 시스템 계정이 시스템에 추가됩니다. 공용 FTP 접속이 형성될 때마다 접속자는 /var/ftp로 보내집니다. 따라서 우리는 이 디렉토리를 FTP 공용 계정의 홈 디렉토리로 사용할 수 있습니다. /var/ftp 디렉토리에 있는 모든 파일과 디렉토리는 ftp://[서버이름/IP]로 접속하여 접근할 수 있습니다.

  vsftpd 설정 파일의 위치는 아래와 같습니다.
  • 우분투, 데비안, 리눅스 민트 등: /etc/vsftpd.conf
  • 센트OS, 페도라, RHEL: /etc/vsftpd/vsftpd.conf

FTP 계정 튜닝
  공용 계정을 비활성화하려면 vsftpd.conf 파일에서 anonymous 계정을 명시적으로 비활성화시켜야 합니다. 디폴트 값이 활성화이기 때문에 주석처리하는 것은 소용이 없습니다.
anonymous_enable=NO
  그리고 서비스를 다시 시작합니다.
# service vsfptd restart
  이러면 이미 시스템에 존재하는 계정을 통해서만 접속할 수 있습니다.

  로컬 계정을 활성화하거나 비활성화하려면 vsftpd.conf 파일을 수정해야 합니다. 로컬 계정을 비활성화할 거면anonymous 계정으로 접속할 수 있도록 만들어놔야 합니다.
local_enable=YES/NO
  적용하려면 마찬가지로 서비스를 다시 시작합니다.
# service vsfptd restart
  특정 계정으로 접속하려면 URI를 ftp://계정명@[서버명/IP]로 사용하면 됩니다. 특정 계정으로 접속하면 해당 계정의 홈 디렉토리에 접근할 수 있습니다.

계정의 홈 디렉토리 밖으로 못 나오게 만들기
  FTP로 접속을 하면 사용자는 권한에 문제가 없는 한 시스템 전체를 돌아다닐 수 있습니다. 이는 모든 사용자가 /etc, /var, /usr 등 모든 시스템 파일들을 읽을 수 있게 해주기 때문에 문제가 있습니다.

  사용자가 FTP로 접속하고 있는 동안 자신의 홈 디렉토리 밖으로 못 나가게 만들려면 파라미터를 아래처럼 수정합니다.
chroot_local_user=YES
  마찬가지로 서비스를 다시 시작합니다.
# service vsftpd restart

SSL/TLS 암호화 적용
  FTP는 평문을 전송하는 프로토콜이기 때문에 클라이언트와 FTP 서버 사이의 파일 전송 트래픽을 누구나 쉽게 훔쳐볼 수 있습니다. 그런 FTP 통신을 암호화하기 위해 SSL/TLS를 활성화할 수 있습니다.

  첫 번째 할 일은 SSL/TLS 인증서와 그에 따른 비밀 키를 만드는 겁니다. 아래 명령어를 통해 인증서와 키를 생성해 한 파일에 저장합니다.

데비안/우분투
$ sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem
센트OS/페도라/RHEL
$ sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
  그리고 나서 아래의 내용을 vsftpd.conf 파일에 적용합니다.
# TLS/SSL 활성화
ssl_enable=YES

# 로그인할 때 클라이언트가 반드시 TLS를 사용하도록 만들기
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH

# SSL 인증서/비밀 키의 위치 지정(Debian/Ubuntu)
# CentOS/Fedora/RHEL는 /etc/vsftpd/vsftpd.pem로 수정
rsa_cert_file=/etc/vsftpd.pem
rsa_private_key_file=/etc/vsftpd.pem

# 패시브 모드 접속을 위한 포트 범위 설정
pasv_max_port=65535
pasv_min_port=64000
  이제 vsftpd를 서비스를 다시 시작합니다.
# service vsftpd restart

접속과 대역폭 제어
  vsftpd는 접속과 사용자 대역폭을 제어할 수 있는 방법을 몇 가지 제공하는데 아래는 그 중 일부의 예입니다.
## anonymous 세션별 대역폭을 대략 30 KB/s로 설정
anon_max_rate=30000

## 각 로컬 계정의 대역폭을 대략 30 KB/s로 설정
local_max_rate=30000

## 클라이언트 세션이 300초 동안 활동이 없을 경우 세션을 끊어버림
idle_session_timeout=300

## 소스 IP 당 최고 접속 수. DoS와 DDoS 공격 방어에 유용
max_per_ip=50

방화벽 튜닝
  iptables 방화벽을 사용하고 있다면 FTP 트래픽을 허용하도록 방화벽 규칙을 조정해야 합니다.
# iptables -I INPUT -p tcp --dport 20 -j ACCEPT
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
# iptables -I INPUT -p tcp --dport 64000:65535 -j ACCEPT
  처음 2개는 FTP 데이터/제어 포트의 트래픽을 허용하는 규칙입니다. 마지막은 앞서 vsftpd.conf 파일에서 정의한 패시브 모드용 포트들의 트래픽을 허용하는 규칙입니다.

로그 활성화
  이 글을 따라하던 중 무슨 문제가 있을 경우에 대비하여 vsftpd.conf 파일에서 아래의 파라미터를 조정하여 로그를 활성화할 수 있습니다.
xferlog_enable=YES
xferlog_std_format=NO
xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES
debug_ssl=YES
# service vsftpd restart

FileZilla를 이용하여 FTP 서버에 접속하기
  SSL/TLS를 지원하는 FTP 클라이언트 중 FileZilla를 사용해보겠습니다. SSL/TLS를 사용하는 FTP 서버에 접속할 땐 아래처럼 설정을 합니다.

출처: http://xmodulo.com/secure-ftp-service-vsftpd-linux.html

  SSL/TLS를 사용하는 서버에 접속할 때 그 서버에 처음 접속하는 거라면 그 서버의 인증서가 표시됩니다. 인증서를 확인하고 로그인을 진행합니다.

출처: http://xmodulo.com/secure-ftp-service-vsftpd-linux.html


sftpd 트러블슈팅
1. FTP 서버에 접속할 때 아래와 같은 에러가 발생한다면 FTP 트래픽이 방화벽에 막히고 있을 가능성이 높습니다. 위에서 설명한 것처럼 필요한 포트를 방화벽에서 열어야 합니다.
ftp: connect: No route to host
2. 센트OS/RHEL에서 실행 중인 chroot 상태의 FTP 서버에 접속할 때 아래와 같은 에러가 발생할 경우 SELinux를 비활성화하거나 SELinux의 설정 값을 변경해야 합니다.
500 OOPS: cannot change directory:/home/dev
Login failed.
  SELinux의 설정 값을 변경하여 해결하려면 아래의 명령어를 사용합니다.
$ sudo setsebool -P ftp_home_dir on
3. FileZilla로 SSL/TLS를 사용하는 서버에 접속할 때 아래와 같은 에러가 발생한다면 vsftpd.conf 파일에 "ssl_ciphers=HIGH"를 추가합니다. vsftpd의 디폴트 암호화 방식(DES-CBC3-SHA)을 FileZilla가 지원하지 않아서 생기는 문제입니다.
Trace:    GnuTLS alert 40: Handshake failed
Error:    GnuTLS error -12: A TLS fatal alert has been received.
"SSL_accept failed: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher"


2014/10/28 16:06 2014/10/28 16:06
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조1: RHEV 평가판 지침서
참조2: RHEV 설치 지침서
참조3: RHEV 매니저 릴리즈 노트
참조4: RHEV 3.0 on VMware Workstation 9

본 문서는 가상 머신에 RHEV 솔루션을 설치하고 연동하는 방법을 설명합니다.

1. 가입 및 평가판 신청
  1. 사이트에 가입하여 로그인 후 Evaluations & Demos 클릭. Red Hat Enterprise Virtualization Evaluation 클릭.
  2. 체험판 양식을 입력하면 메일로 섭스크립션 메일이 도착. 상단에 Subscriptions -> Your Subscriptions -> Active Subscriptions에서도 확인 가능.
  3. RHEV 외에 RHEL 자체도 필요하므로 다시 위 주소로 가서 Evaluations & Demos에서 Red Hat Enterprise Linux 30-Day Evaluation 클릭. 같은 방법으로 양식을 입력하여 30일 평가판 섭스크립션 받음.
2. 이미지 파일 다운로드
  1. 상단에 Products -> Our Products -> Red Hat Enterprise Virtualization -> Evaluations 클릭.
  2. 아래 '1. Download Red Hat Enterprise Linux 6 Server'에 있는 버튼을 클릭. Binary DVD를 다운받음.
  3. 다시 되돌아와 '2. Download Red Hat Enterprise Virtualization Hypervisor'에 RHEV-H Image를 다운받음.
3. RHEL 설치 및 네트워크 설정
  • Red Hat Enterprise Virtualization Manager를 설치하기 위해 먼저 가상 머신에 Red Hat Enterprise Linux를 설치한다.(RHEVM 혼자 요구하는 최소 램이 4기가이므로 그보다 높아야 한다.)
  • 설치 패키지를 선택하는 단계에서 기본 옵션인 Basic Server를 선택한다.
  • 기본 네트워크 설정은 system-config-network 명령어로 설정한다. RHEV를 사용하려면 도메인(FQDN)이 반드시 필요한데 hosts 파일을 설정하여 이를 우회할 수 있다.
  • 네트워크를 위와 같이 수동으로 설정했다면 /etc/sysconfig/network-scripts 디렉토리의 인터페이스 설정 파일(if-eth0)에서 onboot을 yes로 바꿔 서비스 시작시 바로 사용할 수 있도록 하자.
  • 설정했던 IP와 사용할 도메인 쌍을 hosts 파일에 추가한다.
4. RHN 등록 및 채널 추가 후 Red Hat Enterprise Virtualization Manager 설치
주의: 공식적으로 레드햇은 RHN 대신 RHSM(Redhat Subscription Manager)을 추천하는 것으로 보이나 RHEV 평가판 지침서에서 RHN을 사용하고 있기 때문에 그냥 RHN으로 처리.
  1. rhn_register 명령어로 RHN 등록을 한다. RHN 계정명과 패스워드를 입력한다.
  2. yum -y update 명령어로 패키지들을 업데이트 후 리붓을 한다.
  3. redhat의 customer portal 홈페이지에서 로그인을 한 후 Subscriptions -> RHN Classic -> Resistered Systems 선택 후 등록했던 시스템 이름을 클릭. Alter Channel Subscriptions 클릭.
  4. Software Channel Subscriptions에서 아래 채널들 선택(Additional Services Channels for Red Hat Enterprise Linux 6 for x86_64 아래 있는 것도 있음):
    - RHEL Server Supplementary (v. 6 64-bit x86_64)
    - Red Hat Enterprise Virtualization Manager (version.number x86_64)
    - Red Hat JBoss EAP (v 6) for 6Server x86_64
  5. yum -y install rhevm 명령어로 Red Hat Enterprise Virtualization Manager를 설치. rhevm-setup 명령어로 인스톨러 실행. 설치 중 중요한 사항은 아래와 같다.
    - 해당 서버의 80, 443 포트는 접근할 수 있는 상태여야 한다.
    - (ISO 도메인을 위한)공유에서 NFS 공유를 설정하도록 했다면 RHEVM이 설치되는 머신에서 공유가 시작된다.
    - 선택한 스토리지 종류가 데이터 센터와 클러스터를 생성할 때 쓰일 것이다. 그 후에 Administration Portal에서 스토리지를 추가할 수 있다.
5. Red Hat Enterprise Virtualization Hypervisor(RHEVH) 설치
  1. VMware에서 새로운 가상 머신을 생성하며 이때 'install the operating system later'를 선택.
  2. 시스템 스펙으로 2 CPU, 8 GB 램, 'LSI Logic SAS' SCSI 컨트롤러(중요), OS는 RHEL을 선택.
  3. 탐색기로 VM 파일이 저장된 곳으로 가서 vmx 파일에 아래의 줄을 추가.
    apic.xapic.enable = "FALSE"
  4. 같은 파일에서 vcpu.hotadd를 TRUE에서 FALSE로 변경.
    vcpu.hotadd = "TRUE" -> vcpu.hotadd = "FALSE"
  5. 가상 머신 설정에서 Processors 선택. 오른쪽의 Virtualization engine에서 밑에 두 가상화 옵션 체크.
  6. 레드햇 홈페이지에서 RHEV Hypervisor를 다운받아 그 이미지로 부팅.
  7. GRUB 창에서 tab을 눌러 부팅 옵션 수정에 들어가 quiet를 제거하고 엔터를 눌러 설치.


  위의 과정을 모두 거치면 일단 웹 관리 포탈에 접속할 수 있습니다. 하지만 스토리지 도메인 설정이 되어 있지 않기 때문에 아직 정상적인 사용은 불가능합니다. 이후 본격적인 내용은 위 참조1의 평가판 지침서를 참조하시기 바랍니다.

2014/02/07 15:00 2014/02/07 15:00
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : phpvirtualbox - Running Virtual Machines With VirtualBox 4.2 and phpvirtualbox On A Headless Ubuntu 12.04 Server

  phpvirtualbox는 PHP로 만들어진 웹 기반의 VirtualBox 프론트엔드로 원격에서 VirtualBox 인스턴스에 접근 및 제어를 할 수 있게 해줍니다. VirtualBox의 GUI와 비슷하게 구현하여 사용하기가 쉽습니다. 원격에서 웹을 통해 접속하여 GUI로 인스턴스를 제어할 수 있다는 점 때문에 서버에서 설치하여 사용하기 매우 좋습니다. 이 글에서는 VirtualBox와 phpvirtualbox를 설치하여 원격에서 VirtualBox를 제어할 수 있게 연동하는 방법을 소개합니다. 기본적으로 우분투 12.04 서버 버전을 기준으로 설명하고 있지만 13.04 서버 버전 등 다른 버전에서도 가능하며, 몇몇 경로명이나 패키지 설치 명령어 정도만 바꾸면 레드햇 계열의 배포판에서도 충분히 따라 해볼 수 있습니다.

1. 선결조건
  호스트는 우분투 12.04 서버로 가정합니다. 거의 모든 명령어는 root 권한을 필요로 하므로 명령어를 사용할 때마다 sudo를 사용하거나 sudo su 명령어를 통해 root로 로그인해야 합니다.

2. VirtualBox 설치
  /etc/apt/sources.list 파일에 아래 내용을 추가합니다.
deb http://download.virtualbox.org/virtualbox/debian precise contrib
  VirtualBox 공개 키를 받습니다.
# wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | apt-key add -
  패키지 DB를 업데이트하고 VirtualBox 4.2를 설치합니다. dkms 패키지는 리눅스 커널 버전이 바뀔 때 VirtualBox 호스트 커널 모듈도 그에 맞춰 업데이트시키는 역할을 합니다.
# apt-get update
# apt-get install linux-headers-$(uname -r) build-essential virtualbox-4.2 dkms
  VirtualBox는 4.0부터 Remote Desktop Connection Support(VRDP) 등 일부 기능을 "확장팩(extension packs)"이란 이름의 별도 패키지로 제공하고 있습니다. 원격 제어를 하려면 VRDP가 필요하기 때문에 확장팩을 설치해야 합니다. http://www.virtualbox.org/wiki/Downloads에서 두 번째 항목에 있는 'All supported platforms' 링크의 주소를 파악하여 서버에서 다운로드를 합니다. 아래와 버전이 다를 확률이 높기 때문에 반드시 직접 확인하고 다운로드하시기 바랍니다.
# cd /tmp
# wget http://download.virtualbox.org/virtualbox/4.2.16/Oracle_VM_VirtualBox_Extension_Pack-4.2.16-86992.vbox-extpack
# VBoxManage extpack install Oracle_VM_VirtualBox_Extension_Pack-4.2.16-86992.vbox-extpack
  이제 VirtualBox를 실행할 계정을 만들어 패스워드를 설정하고 vboxusers라는 그룹에 넣습니다. 계정명은 vbox로 만들겠습니다.
# useradd –d /home/vbox –m vbox
# passwd vbox
# adduser vbox vboxusers
  위에서 만든 계정을 VirtualBox가 사용하도록 /etc/default/virtualbox 파일을 생성하여 아래 내용을 넣습니다.
VBOXWEB_USER=vbox
  부팅 시 서비스를 실행하도록 만들고 서비스를 실행합니다.
# update-rc.d vboxweb-service defaults
# /etc/init.d/vboxweb-service start

3. Apache, PHP, phpvirtualbox 설치
  아파치와 PHP를 설치합니다.
# apt-get install apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common apache2 apache2-doc apache2-suexec libapache2-mod-php5 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap libapr1 php5-common php5-mysql php-pear
  phpvirtualbox를 다운로드하여 압축을 풀고 documentroot에 복사합니다. phpvirtualbox는 홈페이지에서 최신 버전을 확인하고 다운로드해야 합니다.
# cd /tmp
# wget https://phpvirtualbox.googlecode.com/files/phpvirtualbox-4.2-5.zip
# unzip phpvirtualbox-4.2-5.zip
# mv phpvirtualbox-4.2-5 /var/www/phpvirtualbox/
  템플릿 설정 파일을 일반 설정 파일명으로 복사한 후 계정명과 패스워드를 아까 생성한 계정의 것으로 수정합니다.
# cd /var/www/phpvirtualbox/
# cp config.php-example config.php
# vi config.php
...생략...
var $username = 'vbox';
var $password = '아까 설정한 패스워드';
...생략...
  이것으로 모든 설정이 끝났으며 네트워크상 해당 서버에 접근할 수 있는 컴퓨터의 웹 브라우저에서 http://IP주소/phpvirtualbox를 입력하여 설치했던 phpvirtualbox에 접근할 수 있습니다. 접근하면 로그인 화면이 나오는데 기본 계정명과 패스워드는 admin입니다.
2013/07/17 22:59 2013/07/17 22:59
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 13.04

1. 선결조건
  호스트명은 server1.example.com, IP 주소는 192.168.0.100인 것으로 가정합니다. 거의 모든 명령어는 root 권한을 필요로 하므로 명령어를 사용할 때마다 sudo를 사용하거나 sudo su 명령어를 통해 root로 로그인해야 합니다.

2. MySQL5 설치
apt-get install mysql-server mysql-client
  설치 중 MySQL root 계정의 패스워드를 설정하게 됩니다.

3. Nginx 설치
apt-get install nginx
/etc/init.d/nginx start
  웹 브라우저로 접속 가능 여부를 확인합니다. 우분투 13.04에서 Nginx의 디폴트 document root는 /usr/share/nginx/html 입니다.

4. PHP5 설치
  PHP-FPM(FastCGI Process Manager. PHP FastCGI 구현물로 특히 방문자가 많은 사이트에 유용한 기능을 가지고 있음)로 Nginx에서 PHP5를 사용할 수 있습니다.
apt-get install php5-fpm
  PHP-FPM은 /var/run/php5-fpm.sock 소켓에서 FastCGI 서버를 실행하는 데몬 프로세스입니다. init 스크립트의 위치는 /etc/init.d/php5-fpm 입니다.

5. Nginx 설정
  Nginx의 설정 파일은 /etc/nginx/nginx.conf 입니다. 설정 파일은 이해하기 쉬운 구조로 되어 있습니다.(이곳이곳에서 배울 수 있습니다.)

  (선택사항으로)먼저 워커 프로세스의 개수를 조정하고 keepalive_timeout 값을 적절히 설정합니다.
[...]
worker_processes  4;
[...]
    keepalive_timeout   2;
[...]
  가상 호스트는 server {} 컨테이너에서 정의합니다. 디폴트 vhost는 /etc/nginx/sites-available/default 파일에 정의되어 있습니다. 파일의 내용을 아래처럼 바꾸겠습니다.
[...]
server {
        listen 80;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;
        #}

        #error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}
[...]
  IPv4와 IPv6의 80번 포트를 모두 열기 위해 두 listen 줄의 주석을 모두 제거합니다.

  server_name _; 는 모든 vhost의 server_name을 포괄한다는 의미입니다.(물론 www.example.com처럼 호스트명을 지정할 수도 있습니다.)

  index 줄에는 index.php를 추가했습니다. root /usr/share/nginx/html;은 document root 디렉토리를 지정하는 항목입니다.

  PHP에 있어서 중요한 부분은 location ~ \.php$ {} 로서 이 부분의 주석을 제거해야 합니다.

  Nginx를 리로드합니다.
/etc/init.d/nginx reload
  /etc/php5/fpm/php.ini 파일을 열어 cgi.fix_pathinfo=0; 으로 설정합니다.
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]
  PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Document root 디렉토리인 /usr/share/nginx/html 안에 연동확인용 PHP 파일을 만듭니다.
# vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>
  웹 브라우저에서 위 파일을 열어 PHP가 작동하는지와 Server API 항목이 FPM/FastCGI인지를 확인합니다. MySQL과 연동하지 않았으므로 MySQL과 관련된 항목은 아직 나오지 않습니다.

6. MySQL과 PHP5 연동
  MySQL과 PHP5를 연동하기 위해 php5-mysql 패키지를 설치합니다. 또한 자주 사용하는 PHP5 모듈도 함께 설치합니다. 설치할 수 있는 PHP5 모듈은 아래 명령어로 검색할 수 있습니다.
apt-cache search php5
  아래처럼 php5-mysql과 함께 원하는 모듈들을 설치합니다.
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
  APC는 eAccelerator나 Xcache처럼 PHP의 중간 코드를 캐싱하고 최적화하는 opcode 캐셔로서 PHP 페이지의 속도를 높이는데 큰 도움이 됩니다.
apt-get install php-apc
  이제 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload

7. PHP-FPM이 TCP 연결을 사용하도록 설정
  PHP-FPM은 기본적으로 /var/run/php5-fpm.sock 소켓을 열고 있지만 TCP 연결을 사용하도록 만드는 것도 가능합니다. /etc/php5/fpm/pool.d/www.conf 파일을 열어서 listen 줄을 아래처럼 수정합니다.
[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]
  이것으로 PHP-FPM은 127.0.0.1(localhost)의 9000번 포트를 열게 됩니다. 해당 포트가 미사용 포트인지 확인 후 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Nginx의 설정 파일인 /etc/nginx/sites-available/default를 열어서 fastcgi_pass unix:/var/run/php5-fpm.sock; 줄을 fastcgi_pass 127.0.0.1:9000;로 바꿉니다.
[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
[...]
  마지막으로 Nginx를 리로드합니다.
/etc/init.d/nginx reload

8. CGI/Perl 스크립트
  Nginx로 CGI/Perl 스크립트를 사용해야 한다면 이 글을 참고하시기 바랍니다. fcgiwrap 사용을 추천합니다.(챕터4)

2013/07/17 11:37 2013/07/17 11:37
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Setup Master-Slave Replication in MySQL Server
참조 원문 : MySQL replication - Master/Slave

  MySQL 리플리케이션이란 마스터와 슬레이브 DB 서버를 설정하여 마스터의 DB 데이터를 슬레이브의 DB에 자동으로 복사하게 하는 일종의 DB 고가용성(High Availablility) 솔루션입니다. 마스터 서버가 죽는 일이 발생해도 슬레이브 서버를 통해 데이터를 이용할 수 있습니다.

  리플리케이션을 활용하는 방법은 여러가지가 있는데 이 글에서는 가장 간단한 방식인 1마스터/1슬레이브 설정을 소개합니다. 이를 위해 아래의 두 서버로 작업한다고 가정하겠습니다. 또한 이 글에서 사용하는 방법은 MySQL 5.5 이상에서 사용하는 방법으로 그보다 더 낮은 버전은 슬레이브 설정 방법이 약간 다르므로 참고하시기 바랍니다.
MySQL Master system : CentOS 6.4
Master IP Address : 192.168.1.250/24
MySQL Slave system : CentOS 6.4
Slave IP Address: 192.168.1.150/24

MySQL 설치
  iptables이 3306 포트를 허용하도록 /etc/sysconfig/iptables 파일의 적절한 위치에 아래 내용을 추가합니다. 이 작업은 마스터 서버에서만 하면 됩니다.
-A INPUT -p udp -m state --state NEW --dport 3306 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 3306 -j ACCEPT
  iptables를 재시작합니다.
# service iptables restart
  마스터와 슬레이브 서버에 MySQL을 설치하고 서비스를 시작합니다. 아래의 설치 작업은 두 서버에서 모두 실시합니다.
# yum install mysql-server mysql -y
# service mysqld start
# chkconfig mysqld on
  MySQL의 기본 보안 및 Root 패스워드를 설정합니다.
# /usr/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MySQL to secure it, we'll need the current password for the root user.  If you've just installed MySQL, 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 MySQL
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 MySQL installation has an anonymous user, allowing anyone to log into MySQL 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]
... 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]
... Success!

By default, MySQL 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]
- 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]
... Success!

Cleaning up...

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

Thanks for using MySQL!

MySQL 마스터 설정
  /etc/my.cnf 파일을 열어 [mysqld] 섹션에 아래 내용을 추가합니다.
log-bin = mysql-bin
server-id = 1
  추가가 끝나면 MySQL을 재시작합니다.
# service mysqld restart
  MySQL에 로그인해서 슬레이브 서버가 사용할 계정과 패스워드를 생성합니다. 여기선 슬레이브 계정명으로 mirashi, 패스워드로 passpass를 사용하겠습니다.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT REPLICATION SLAVE ON *.* TO 'mirashi'@'%' IDENTIFIED BY 'passpass';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 | myservlab    |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.01 sec)

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
  파일명(위에선 mysql-bin.000001)과 위치 번호(위에선 106)는 나중에 필요하기 때문에 별도로 적어놓습니다.

MySQL 슬레이브 설정
  /etc/my.cnf 파일을 열어 [mysqld] 섹션에 아래 내용을 추가합니다. 아래 내용을 추가합니다.
server-id = 2
  추가가 끝나면 MySQL을 재시작합니다.
# service mysqld restart
  MySQL에 root 계정으로 로그인해서 아까 마스터 서버에서 SHOW MASTER STATUS; 명령어로 확인했던 마스터 로그 파일에 대한 정보를 슬레이브 서버에 입력합니다.
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.250', MASTER_USER='mirashi', MASTER_PASSWORD='passpass', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
Query OK, 0 rows affected (0.03 sec)

mysql> START SLAVE;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.250
                Master_User: mirashi
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 314
             Relay_Log_File: mysqld-relay-bin.000001
              Relay_Log_Pos: 235
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB:
        Replicate_Ignore_DB:
         Replicate_Do_Table:
     Replicate_Ignore_Table:
    Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                 Last_Errno: 0
                 Last_Error:
               Skip_Counter: 0
        Exec_Master_Log_Pos: 314
            Relay_Log_Space: 235
            Until_Condition: None
             Until_Log_File:
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File:
         Master_SSL_CA_Path:
            Master_SSL_Cert:
          Master_SSL_Cipher:
             Master_SSL_Key:
      Seconds_Behind_Master: 0
  Slave_IO_State가 'Waiting for master to send event'이며 Seconds_Behind_Master 가 'NULL'이 아니면 리플리케이션이 작동하고 있는 것입니다.

리플리케이션 테스트
마스터 서버
# mysql -u root -p
Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database myservlab;
Query OK, 1 row affected (0.04 sec)

mysql> use myservlab;
Database changed

mysql> create table sample (c int);
Query OK, 0 rows affected (0.08 sec)

mysql> insert into sample (c) values (1);
Query OK, 1 row affected (0.01 sec)

mysql> select * from sample;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql>
슬레이브 서버
# mysql -u root -p
Enter password: Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.1.69-log Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use myservlab;
Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from sample;
+------+
| c    |
+------+
|    1 |
+------+
1 row in set (0.01 sec)

mysql>
2013/07/16 13:05 2013/07/16 13:05
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Create a Local Repository on Ubuntu 13.04 Server
참조 원문 : Create a Local Ubuntu Repository using Apt-Mirror and Apt-Cacher

  로컬 네트워크에 있는 다수의 시스템에 소프트웨어, 보안 업데이트를 자주 설치해야 한다면 로컬 우분투 저장소를 두는 것이 효율적입니다. 필요한 모든 패키지를 LAN을 통해 받을 수 있어 인터넷 대역폭을 아낄 수 있기 때문입니다. 이 글에서는 우분투 13.04 서버에 로컬 저장소를 설치하는 두 가지 방법을 소개합니다.

방법 1: APT-Mirror
  이 방법은 공인 저장소(우분투 메인 서버)로부터 모든 패키지를 끌어와 우리 서버의 로컬 하드 드라이브에 저장하는 방법입니다. 먼저 Apache 서버를 설치합니다. 이는 네트워크를 통해 패키지를 공유하기 위해 필요합니다. 그 후 APT-Mirror를 설치합니다.
$ sudo apt-get install apache2
$ sudo apt-get install apt-mirror
  최소 50GB 이상의 빈 공간이 필요합니다. 이 글에서는 /myrepo라는 디렉토리를 생성하여 모든 패키지를 그 디렉토리 안에 저장할 것입니다.
$ sudo mkdir /myrepo
  /etc/apt/mirror.list 파일을 열어서 아래에서 설명하고 있는 부분들을 변경합니다.
############# config ##################
#

## 주석을 해제하고 저장소 디렉토리를 설정 ##
set base_path    /myrepo

#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch  <running host architecture>
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0

## 다운로드 쓰레드 개수 ##
set nthreads     20
set _tilde 0
#
############# end config ##############

deb http://archive.ubuntu.com/ubuntu raring main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu raring-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu raring-updates main restricted universe multiverse [...]
  위 설정 파일에서 우분투 소스 목록을 추가할 수 있습니다. 이 글에서는 디폴트 13.04 소스 리스트를 사용합니다.

  32비트와 64비트를 모두 사용한다면 위 파일에서 저장소를 지정할 때 관련 내용을 넣어야 합니다. 32비트와 관련된 줄은 deb-i386로 시작해야 하며, 64비트와 관련된 줄은 deb-amd64로 시작해야 합니다. 수정을 마치면 아래 명령어로 저장소를 생성합니다.
$ sudo apt-mirror
[sudo] password for mirashi:
Downloading 2028 index files using 20 threads...
Begin time: Wed May 29 23:23:09 2013
[20]...
  이제 공인 저장소의 패키지가 로컬 저장소에 저장됩니다. 당연히 이 작업에는 상당한 시간이 소요됩니다. 참고로 중간에 중단했다가 후에 다시 실행하면 중단했던 부분부터 다시 재개하므로 부담없이 중간에 중단할 수 있습니다.

  위 명령어는 새로운 소프트웨어와 업데이트를 받기 위해 주기적으로 실행할 필요가 있습니다. /etc/cron.d/apt-mirror 파일을 열어서 아래 줄의 주석을 제거합니다.
0 4 * * *   apt-mirror      /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log
  이제 클라이언트가 http를 통해 패키지를 가져갈 수 있도록 만들어야 합니다. Apache의 DocumentRoot에 가서 아래와 같이 심볼릭 링크를 생성합니다. 기본적으로 Apache의 DocumentRoot는 FollowSymLinks 옵션을 가지고 있기 때문에 이것으로 해결할 수 있지만 보안을 강화하기 위해 해당 옵션을 제거한 상태라면 다시 추가하거나 Apache의 Alias 기능을 사용하는 등 다른 방법을 찾아야 합니다.
$ cd /var/www/html
$ sudo ln -s /myrepo/mirror/us.archive.ubuntu.com/ubuntu/ ubuntu

클라이언트 설정
  클라이언트에서 /etc/apt/sources.list 파일을 열어서 로컬 저장소 경로를 추가합니다.
[...]
deb http://192.168.1.200/ubuntu raring universe
deb http://192.168.1.200/ubuntu raring main restricted
deb http://192.168.1.200/ubuntu raring-updates main restricted
[...]


방법 2: APT-Cacher
  APT-Cacher는 이름처럼 클라이언트가 요청한 적이 있었던 패키지들을 보관했다가 클라이언트가 해당 패키지를 요구할 때 제공하는 방식입니다.

  이 방식도 Apache 서버를 설치해야 합니다. 그 후 APT-Cacher를 설치합니다.
$ sudo apt-get install apache2
$ sudo apt-get install apt-cacher
  이때 데몬(스탠드얼론)과 inetd 중 어느 방식으로 운영할지를 묻는데 원하는 방식을 선택합니다. 설치가 끝나면 /etc/default/apt-cacher 파일을 열어 AUTOSTART가 0으로 되어 있으면 1로 수정합니다.

  원한다면 /etc/apt-cacher/apt-cacher.conf 파일의 allowed_hosts와 denied_hosts 항목으로 캐시에 접근 가능/불가 호스트를 지정할 수 있습니다. 만약 해당 항목을 수정했다면 apt-cacher를 재시작합니다.
sudo /etc/init.d/apt-cacher restart
  이제 모든 클라이언트에서 /etc/apt/apt.conf.d/90-apt-proxy.conf 파일을 만들어 아래 내용을 넣습니다.
Acquire::http::Proxy "http://서버IP:3142";
2013/07/15 16:40 2013/07/15 16:40
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Configuring VNC Server Access on a Redhat Linux

  VNC는 소개한 적이 여러 번 있으므로 레드햇 계열의 배포판에 설치하는 것을 중점으로 핵심 내용만 나열하겠습니다.

1. VNC 서버 설치
# yum install tigervnc-server

2. VNC 세션 설정
  각 계정마다 개별적인 세션을 부여하고 싶다면 VNC 설정 파일인 /etc/sysconfig/vncservers 파일을 수정합니다. 아래는 "lubos"라는 계정을 위해 추가하는 내용입니다.
VNCSERVERS="2:lubos"
VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost"
  위의 내용을 추가하면 VNC session 2가 지정된 해상도로 lubos라는 계정에 할당됩니다. -nolisten과 -localhost는 보안을 위해 추가한 것으로 VNC에 직접 접속할 계획이라면 두 옵션을 뺀 후 방화벽에서 VNC 포트를 열어야 합니다. 이 글에서는 보안을 위해 SSH 터널을 사용하는 쪽으로 설명하겠습니다.

  VNC 서비스를 시작하기 전에 /etc/sysconfig/vncservers에 설정한 각 계정의 세션을 위한 VNC 패스워드를 생성해야 합니다. 해당 계정으로 변경 후 vncpasswd 명령어를 사용합니다.
[root@localhost ~]# su lubos
[lubos@localhost root]$ vncpasswd
Password:
Verify:
  이제 VNC 서비스를 시작합니다.
# service vncserver start

3. VNC 서버에 직접 접속
  SSH 터널을 사용하지 않고 직접 접속할 수 있게 설정했다면 접속을 위해 먼저 방화벽을 적절히 설정해야 합니다. 그 후 아래와 같은 방법으로 쉽게 접속할 수 있습니다.
$ vncviewer 서버주소:2
Connected to RFB server, using protocol version 3.8
Performing standard VNC authentication
Password:
Authentication successful
  서버주소 뒤에 있는 2는 아까 계정에 할당한 세션 번호입니다. 패스워드를 입력하면 세션이 시작됩니다.

4. SSH 터널을 통해 VNC 서버에 접속
  vncviewer의 -via 옵션을 사용하면 자동으로 ssh 터널을 만들어주기 때문에 쉽게 접속할 수 있습니다.
$ vncviewer -via lubos@서버주소 localhost:2
2013/07/14 00:13 2013/07/14 00:13
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : What is RCRON.. & How to Setup High Availability of cron Jobs Using RCRON

  HA(High Availability) 환경에서 cron을 사용해보신 분들이라면 이 프로그램이 유용하단 걸 동감하실 수 있으실 겁니다. 서버가 2대 있고 이 2대가 클러스터 구성일 때 액티브 서버에서만 실행되어야 할 cron 스케줄이 있다면 꽤 귀찮은 일이 생깁니다. 액티브와 스탠바이가 바꼈을 때 두 서버의 cron을 수동으로 수정해야 하기 때문이죠. Rcron은 이런 경우에 사용하는 프로그램으로서 구성 서버들 간의 상태를 확인하고 액티브 상태의 서버에서만 지정한 작업을 실행할 수 있게 해줍니다.

  그런데 rcron은 다른 서버의 생존을 파악하는 능력이 없기 때문에 그 역할을 위한 프로그램을 추가로 함께 사용해야 합니다. 이를 위해 이 글에서는 keepalived라는 별도의 데몬을 사용할 것입니다. Keepalived는 상대 노드에 신호를 보내고 응답이 없을 경우 링크가 죽었다고 판단하는 역할을 합니다.

  여기서는 하나의 노드를 keepalived 마스터로 설정하고 다른 한 노드를 keepalived 백업으로 설정할 겁니다. 마스터 노드는 rcron 상태가 액티브로 되며, 백업 노드는 패시브로 설정됩니다. 마스터 노드는 죽을 때 백업 노드에게 0 우선순위 신호를 보내며 이를 받은 백업 노드는 마스터 노드가 되어 rcron을 액티브 상태로 전환합니다. 그러다가 이전의 마스터 노드가 다시 살아나면 마스터 권한을 넘긴 후 백업 모드로 돌아가게 설정할 겁니다.

  설정 환경은 레드햇 계열 배포판인 것으로 가정합니다.


1. /etc/sysctl.conf 파일을 수정하여 두 노드의IP 포워딩 활성화시키기
net.ipv4.ip_forward = 1
# sysctl -p      ; 리부팅 없이 변경사항 적용

2. 두 노드에 EPEL 저장소 추가
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm

3. 두 노드에 필요한 패키지 설치
# yum install subversion byacc flex gcc

4. 프록시 서버를 통해 인터넷 연결을 할 경우 svn에 대한 http_proxy 설정(직접 인터넷 연결을 할 경우 생략)
# mkdir /root/.subversion/
#  vi ~/.subversion/servers
http-proxy-exceptions = *.example.com
http-proxy-host = www.example.com
http-proxy-port = 8080
http-compression = no

5. SVN으로 rcron 설치
# cd /root;
# svn co http://rcron.googlecode.com/svn/trunk rcron
# cd rcron/rcron
# ./configure
# make
# make install

6. 두 노드에 디렉토리 및 설정 파일 생성
# mkdir /etc/rcron/
# vi /etc/rcron/rcron.conf
(1) 마스터 서버 노드
  아래 내용 입력
# An arbitrary name
cluster_name        = cluster

# A file containing either the word "active" or the word "passive"
state_file          = /var/run/rcron/state

# The default state in case state_file can't be read
#default_state       = active
syslog_facility     = LOG_CRON
syslog_level        = LOG_INFO

# We can tune jobs niceness/priorities
nice_level          = 19
  아래 명령어 실행
# mkdir /var/run/rcron
# touch /var/run/rcron/state
# echo "active" > /var/run/rcron/state
(2) 백업 서버 노드
  아래 내용 입력
# An arbitrary name
cluster_name = cluster
# A file containing either the word "active" or the word "passive"
state_file = /var/run/rcron/state
# The default state in case state_file can't be read
#default_state = passive
syslog_facility = LOG_CRON
syslog_level = LOG_INFO
# We can tune jobs niceness/priorities
nice_level = 19
  아래 명령어 실행
# mkdir /var/run/rcron
# touch /var/run/rcron/state
# echo "passive" > /var/run/rcron/state

7. 두 노드에 Keepalive 패키지 설치
(1) 최신 소스 다운로드
# cd /root
# wget http://cgit.luffy.cx/keepalived/snapshot/keepalived-1.2.7.tar.gz
(2) RPM BUILD 패키지 설치
# yum -y install rpm-build
(3) 압축 풀기 및 keepalived.spec.in 파일 수정
# tar -zxvf keepalived-1.2.7.tar.gz
# mkdir -p /root/rpmbuild/SOURCES/
# cp /root/keepalived-1.2.7.tar.gz /root/rpmbuild/SOURCES/
# vi /root/keepalived-1.2.7/keepalived.spec.in
(Version 1.2.2를 Version 1.2.7로 수정)
# yum -y install popt*
# cd /root/keepalived-1.2.7
# rpmbuild -ba keepalived.spec.in
  위 명령어를 사용하면 소스를 이용해 컴파일된 RPM이 /root/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm라는 경로 및 파일명으로 생성됩니다. 이 파일을 이용해 설치합니다.
# rpm -ivh /root/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm

8. keepalived 설정
(1) 마스터 노드(172.16.243.144)
# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state MASTER
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 31
priority 101
advert_int 5
vrrp_unicast_bind 172.16.243.144
vrrp_unicast_peer 172.16.243.145

authentication {
auth_type PASS
auth_pass 1111
}

notify_backup "/bin/echo passive > /var/run/rcron/state"
notify_master "/bin/echo active > /var/run/rcron/state"
notify_fault "/bin/echo passive > /var/run/rcron/state"
}
(2) 백업 노드(172.16.243.145)
# vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 31
priority 100
advert_int 5
vrrp_unicast_bind 172.16.243.145
vrrp_unicast_peer 172.16.243.144

authentication {
auth_type PASS
auth_pass 1111
}

notify_backup "/bin/echo passive > /var/run/rcron/state"
notify_master "/bin/echo active > /var/run/rcron/state"
notify_fault "/bin/echo passive > /var/run/rcron/state"
}

9. 두 노드에 실험용 crontab 항목 생성
* * * * * /usr/local/bin/rcron --conf /etc/rcron/rcron.conf echo `date` >> /tmp/output
  두 노드 모두 keepalive 서비스를 시작합니다.
# service keepalived start ; chkconfig keepalived on

10. keepalived 데몬이 죽을 경우에 대비
  아래의 crontab 항목을 추가합니다.
* * * * * * /root/keep-alive-monitor
  그리고 아래 스크립트를 생성합니다.
# vi /root/keep-alive-monitor

#!/bin/sh
echo "test" >> /tmp/monitor;
ps -ef|grep -v grep|grep -i keepalived;
if [ $? -eq 0 ] ; then
exit 0
else
echo "passive" > /var/run/rcron/state;
/etc/init.d/keepalived restart;
fi
2013/07/13 22:52 2013/07/13 22:52
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : How to protect Apache with Fail2ban

  Fail2ban은 파이썬으로 만든 침입 방지 프레임워크입니다. 패킷 컨트롤 시스템(예: TCP Wrapper)이나 자체적으로 방화벽(예: iptables)이 설치된 POSIX 시스템이라면 사용할 수 있습니다. Fail2ban의 주요 기능은 로그 파일을 감시하여 너무 많이 로그인을 시도하거나 비정상적인 행동을 하는 호스트의 IP를 차단하는 겁니다. 이 글에서는 아파치에 fail2ban을 적용하여 보안성을 높이는 방법을 소개합니다. Fail2ban의 설치와 기본 사용법은 이 글을 참조하시기 바랍니다.

  이 글에서는 악성 IP를 찾아 감옥(Jail)에 넣기 위해 jail 파일(fail2ban 설정을 담고 있는 파일)에 규칙을 생성하여 대상 IP의 요청을 일정 시간 동안 무시하도록 만들 겁니다.

  내용은 데비안 계열 배포판을 기준으로 /etc/fail2ban/jail.local 파일에서 진행합니다.

1. 표준 설정 활성화
  기본적으로 fail2ban에는 apache에 대한 공격을 어느 정도 막아주는 규칙이 포함되어 있습니다. 이를 사용하기 위해 /etc/fail2ban/jail.local 파일에서 아래의 내용을 작성하여 3개의 "감옥"을 활성화합니다.
[apache]
enabled = true

[apache-noscript]
enabled = true

[apache-overflows]
enabled = true
(1) Jail Apache
  이 감옥은 /var/log/apache*/*error.log 파일에서 정규 표현식으로 패스워드 인증 실패 메시지를 찾습니다. 이 규칙의 목표는 아래의 규칙 중 하나에 해당하는 IP를 모두 차단하는 것입니다.
failregex = [[]client []] user .* authentication failure
            [[]client []] user .* not found
            [[]client []] user .* password mismatch
(2) Jail Apache-noscript
  이 감옥은 /var/log/apache*/*error.log 파일에서 정규 표현식으로 스크립트를 찾을 수 없다는 에러 메시지를 찾습니다. 이 규칙의 목표는 존재하지 않는 스크립트(php, perl, asp)를 찾으려는 IP를 모두 차단하는 것이며 아래는 이 감옥에서 사용하는 필터입니다.
failregex = [[]client []] (File does not exist|script not found or unable to stat): /S*(.php|.asp|.exe|.pl)
            [[]client []] script '/S*(.php|.asp|.exe|.pl)S*' not found or unable to stat *$
(3) Jail Apache-overflows
  이 감옥은 Apache 오버플로우를 시도하는 클라이언트를 정규 표현식으로 잡아냅니다.
failregex = [[]client []] (Invalid method in request|request failed: URI too long|erroneous characters after protocol string)

2. 추가 설정
  추가적인 감옥과 필터 예제 2가지를 소개합니다.

(1) Jail Apache-phpmyadmin
  이 설정의 목표는 phpmyadmin 설치본을 찾으려고 하는 클라이언트를 막는 것입니다. 주의할 점은 phpmyadmin이 설치된 디렉토리 이름이 badadmin에 나열된 것에 포함되어 있지 않아야 한다는 겁니다. 아래 내용을 /etc/fail2ban/jail.local 파일에 추가합니다.
[apache-phpmyadmin]
enabled  = true
port     = http,https
filter   = apache-phpmyadmin
logpath  = /var/log/apache*/*error.log
maxretry = 3
  그리고 /etc/fail2ban/filter.d/apache-phpmyadmin.conf 파일을 만들어 아래 내용을 넣습니다.
# Fail2Ban configuration file
#
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
#
# Author: Gina Haeussge
#
 
[Definition]
 
docroot = /var/www
badadmin = PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2
 
# Option:  failregex
# Notes.:  Regexp to match often probed and not available phpmyadmin paths.
# Values:  TEXT
#
failregex = [[]client []] File does not exist: %(docroot)s/(?:%(badadmin)s)
 
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =
(2) Jail Apache-postflood
  이 감옥 규칙의 목표는 apache POST flood 공격을 막는 겁니다. /etc/fail2ban/jail.local에 아래 내용을 추가하면 10초 안에 POST 요청을 10번 이상 하는 클라이언트를 막습니다.
[apache-postflood]
enabled = true
filter = apache-postflood
logpath = /var/log/httpd/access_log
findtime = 10
maxretry = 10
  그리고 /etc/fail2ban/filter.d/apache-postflood.conf 파일을 만들어 아래 내용을 넣습니다.
# Fail2Ban configuration file
#
#
# $Revision: 1 $
#

[Definition]
# Option: failregex
# Notes.: Regexp to catch known spambots and software alike. Please verify
# that it is your intent to block IPs which were driven by
# abovementioned bots.
# Values: TEXT
#
failregex = ^ -.*”POST.*

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
2013/07/13 21:13 2013/07/13 21:13