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

Posted
Filed under 프로그램과 명령어/네트워크와 보안
참조 원문 : How to conduct security vulnerability assessment of a remote server with OpenVAS

  OpenVAS는 취약점 스캐닝 및 관리 도구로 이루어진 오픈 소스 프레임워크로서 GPL 라이선스로 다양한 플랫폼에서 자유롭게 사용할 수 있습니다.

출처: http://www.openvas.org/

  이 글에서는 OpenVAS로 원격 서버에 대한 보안 취약점 분석 방법을 알아보겠습니다. OpenVAS는 소스 코드나 리눅스 패키지로 설치할 수 있으며 원한다면 가상 어플라이언스로서 실행하는 것도 가능합니다. 이 글에서는 VirtualBox를 이용해 가상 어플라이언스로 돌리는 것을 기준으로 하겠습니다.


1. OpenVAS 가상 어플라이언스 설치
  먼저 OpenVAS OVA 이미지를 내려받습니다. 그 후 VirtualBox를 실행하고 "Import Appliance"를 선택하여 OVA 이미지를 추출합니다. "Bridge Adapter"를 선택하고 스캔 대상이 있는 네트워크에 연결합니다.

  OpenVAS 어플라이언스를 켭니다. 콘솔 스크린이 나타나면 root로 로그인합니다. 디폴트 root 패스워드는 "root"입니다.

  OpenVAS는 Debian Squeeze를 기반으로 합니다. 기본적으로 설치 직후에 기반 시스템을 업그레이드하여 최신 보안 업데이트를 설치하는 것이 좋습니다.
# apt-get dist-upgrade
# apt-get upgrade
  미리 설치된 암호키를 제거한 뒤, 새로운 키를 생성합니다. 이 키는 인증된 스캔 결과와 기타 인증 정보를 암호화할 때 사용합니다.
# gpg --homedir=/usr/local/etc/openvas/gnupg --delete-secret-keys 94094F5B
# gpg --homedir=/usr/local/etc/openvas/gnupg --delete-keys 94094F5B
# openvasmd --create-credentials-encryption-key
  참고로 위의 키 생성 작업은 많은 시간을 소요할 수 있습니다.(최대 60분) 키 생성이 끝나면 OpenVAS 매니저를 재시작합니다.
# /etc/init.d/openvas-manager restart
  OpenVAS에는 Greenbone Security Assistant라는 웹 클라이언트가 포함되어 있습니다. 이 웹 클라이언트는 OpenVAS의 모든 기능을 활용하기 위해 최적화된 웹 기반의 인터페이스를 제공합니다.

2. OpenVAS 관리 웹 인터페이스에 접속
  OpenVAS의 웹 인터페이스에 접속하려면 https://<OpenVAS 어플라이언스의 IP 주소>로 접속합니다. OpenVAS는 자체 서명한 SSL 인증서를 사용합니다. 그러므로 웹 브라우저로 처음 접속했을 때 예외 사이트로 등록해야 합니다. 미리 설정된 관리용 OpenVAS 계정(login: "admin", 패스워드: "admin")으로 로그인합니다. 그러면 아래와 같은 OpenVAS의 메인 윈도우를 볼 수 있습니다.

출처: 참조 원문 사이트


3. 스캔 대상 설정
  먼저 할 일은 스캔 대상(예: 스캔할 원격 호스트)을 설정하는 겁니다. "Configuration" -> "Targets" 메뉴에서 새로운 대상을 추가하기 위해 별 모양의 아이콘을 클릭합니다.

  "manual"을 선택하여 원격 호스트의 IP 주소를 입력합니다. 드랍 다운 리스트에서 포트 리스트를 선택합니다. 완료하면 "Create Target" 버튼을 클릭합니다.

출처: 참조 원문 사이트


4. 설정과 스캔 시작
  스캐닝 시작을 위해 새로운 작업을 생성합니다. "Scan Management" -> "New Task" 메뉴를 선택합니다. 새로운 스캔의 이름을 입력합니다. "Scan Config"에서 원하는 설정을 선택합니다. 이것은 어떤 취약점 테스트를 진행할지를 결정합니다. 밑에서도 설명하겠지만 원하는대로 직접 scan config를 만들 수도 있습니다. "Scan Target"에서 아까 만든 대상을 선택합니다. 모든 선택이 끝나면 "Create Task" 버튼을 클릭합니다.

출처: 참조 원문 사이트

  작업을 생성하면 "Actions" 필드에 있는 "Play" 버튼을 클릭하여 대상에 대한 스캐닝을 시작합니다. Task Details 페이지에서 스캔 진행률을 확인할 수 있습니다.

출처: 참조 원문 사이트


5. 취약점 스캔 보고서 확인
  스캔이 끝난 후 "Actions" 필드에 있는 돋보기 아이콘을 클릭하여 스캔 결과의 요약 내용을 확인할 수 있습니다.

  스캔 결과는 "High", "Medium", "Low" 위험도로 분류되며, 자세한 로그도 포함하고 있습니다. 밝혀진 보안 문제마다 요약된 취약점 내용, 영향도, 관계된 소프트웨어/OS, 보완 방법을 보고합니다. 아래는 샘플 스캔 보고서의 스크린샷입니다.

출처: 참조 원문 사이트

  원한다면 스캔 보고서를 다운로드가 가능한 문서로 출력할 수 있습니다. OpenVAS는 스캔 보고서를 PDF, TXT, HTML, XML을 포함한 다양한 포맷으로 출력하는 것을 지원합니다.

  또한 "Asset Management" -> "Hosts" 메뉴를 통해 각 스캔 대상에 대해 자세한 "prognostic(진단)" 보고서를 확인할 수 있습니다. 조사를 원하는 대상에 대해 "Prognostic Report" 아이콘을 클릭합니다. 위에서 이미 설명했던 스캔 보고서가 특정 스캔에 대한 결과를 제공했다면, 진단 보고서는 특정 호스트에 대한 모든 이전 스캔의 총체적인 결과를 자세히 제공합니다. 일반적인 진단 보고서는 아래와 같이 생겼습니다.

출처: 참조 원문 사이트


6. 취약점 스캔을 원하는대로 설정하기
  스캔 설정을 원하는대로 생성하거나 수정하는 것도 가능합니다. 이미 있는 스캔 설정을 보려면 "Configuration" -> "Scan Configs"로 갑니다. 아래는 스캔 설정이 네트워크 취약점 테스트(NVTs) 목록을 포함하고 있는 모습입니다. 현재 스캔 설정을 수정하기 위해 설정을 XML로 출력할 수 있으며, 그것을 수정한 후 다시 읽어들일 수 있습니다.

출처: 참조 원문 사이트

  또한 "Configuration" -> "Port Lists"에서 스캔할 포트의 목록도 수정할 수 있습니다.

출처: 참조 원문 사이트


7. 최신 취약점 테스트 도구 다운로드
  OpenVAS 프로젝트는 네트워크 취약점 테스트(NVTs), 보안 컨텐트 자동화 프로토콜(SCAP), CERT 자문의 공개 정보 공급을 유지하고 있습니다. 간단히 "Administration"에서 "Synchronizing with Feed now" 버튼을 클릭함으로써 최신 정보 공급을 반영할 수 있습니다.

출처: 참조 원문 사이트

2013/08/18 17:12 2013/08/18 17:12
Posted
Filed under 프로그램과 명령어/커맨드 라인 트릭
참조 원문 : Groping through big data with grep

1. 숫자 4개로 시작하는 줄 뽑아내기
grep ^[0-9][0-9][0-9][0-9] textfile
grep -E "^[0-9]{4}" textfile
  하지만 이 조건만으로는 4자리로 시작하기만 하면 무조건 걸려나옵니다. } 문자 뒤에 공백을 하나 넣어서 처리할 수 있지만 좀 더   좋은 방법은 "단어 단위" 기능(<와 >)을 사용하는 것입니다.
$ grep '\<[0-9]\{4\}\>' textfile
2010
2013 is turning out to be a better year
  다만 이 방법을 사용할 때 주의할 점이 있습니다. 아래를 보시죠.
$ grep '\<[0-9]\{3,5\}\>' textfile
2010
2013 is turning out to be a better year
12345 Taylor Avenue
127.0.0.1
  다른 건 괜찮았는데 마지막에 IP 주소가 걸려 나왔습니다. 숫자 뒤에 문자가 나오는 경우도 "단어의 끝"으로 취급하기 때문입니다. 단어 단위로 걸러낼 때는 이런 사항도 고려해야 합니다.

2. IP 주소 뽑아내기
  IP 주소를 검출하는 게 은근히 생각보다 까다롭습니다. 먼저 특정 IP를 찾는 것부터 시작하겠습니다. 생각없이 그냥 지르면 이런 모습이 나옵니다.
$ grep 12.45.78.0 text
1234567890
12.45.78.0
  정규 표현식에서 점(.)은 하나의 문자를 뜻하니까요. 이럴 땐 -F 옵션(fixed string)을 사용하거나, fgrep 명령어를 사용하거나, 이스케이프 문자를 사용해야 합니다. 처음 두 방법은 사실상 같은 거나 다름없습니다.
$ grep -F 12.45.78.0 text
12.45.78.0
$ fgrep 12.45.78.0 text
12.45.78.0
$ grep "10\.20\.30\.40" textfile
Don't use the 10.20.30.40 address unless you first talk to Pete.
  이제 IPv4 주소 형식을 띈 문자열을 잡아내는 패턴의 예를 보겠습니다.
$ grep -w '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' textfile
127.0.0.1
Don't use the 10.20.30.40 address unless you first talk to Pete.
Refer to Section 11.2.3.4.20 for the process guidelines.
  마지막에 엉뚱한 게 나왔듯이 위의 방법도 완벽하진 않습니다만 여기서 더 발전시켰다간 필요 이상으로 복잡해지기 때문에 이 정도로 끝내는 게 적절할 것 같습니다.

2013/07/17 16:33 2013/07/17 16:33
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 쉘 스크립트
참조 원문 : Unix tip: Using Bash's regular expressions

  버전 3(2004년)부터 bash는 =~ 로 표기하는 내장형 정규 표현식 비교 연산자를 갖추었습니다. 그래서 사실 스크립트에서 grep이나 sed로 하는 작업의 상당수는 이 연산자로 처리할 수 있습니다.

  다른 비교 연산자(-lt, == 등)와 마찬가지로 비교 결과가 참이면 0을 리턴합니다. 아래 예제는 $digit의 값이 하나의 숫자인지를 판별하는 것을 보여주고 있습니다.
if [[ $digit =~ [0-9] ]]; then
    echo '$digit is a digit'
else
    echo "oops"
fi

  아래는 프롬프트에 입력한 값이 숫자만으로 구성되어 있는지를 판별하는 예제입니다.
echo -n "Your answer> "
read REPLY
if [[ $REPLY =~ ^[0-9]+$ ]]; then
    echo Numeric
else
    echo Non-numeric
fi

  Bash의 정규 표현식도 상당히 복잡하게 응용해서 사용할 수 있습니다. $email 변수의 값이 이메일 주소 형식인지를 판별하는 예제입니다. 첫 번째 표현식(계정명)은 문자, 숫자, 일부 특수 문자를 받습니다. 첫 번째 ]의 오른쪽에 있는 +는 앞의 표현식에 해당하는 문자를 몇 개든지 받는다는 뜻입니다. 그 뒤에는 계정명과 이메일 도메인 사이에 @ 문자가 있는지 확인합니다. 그리고 도메인 명의 앞부분과 뒷부분 사이에 점(\.)이 있는지 확인합니다.
if [[ "$email" =~ "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$" ]]
then
    echo "This email address looks fine: $email"
else
    echo "This email address is flawed: $email"
fi

  아래는 변수의 값이 IP 주소 형태인지를 판별하는 예제입니다.
#!/bin/bash

if [ $# != 1 ]; then
    echo "Usage: $0 address"
    exit 1
else
    ip=$1
fi

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    echo "Looks like an IPv4 IP address"
elif [[ $ip =~ ^[A-Fa-f0-9:]+$ ]]; then
    echo "Could be an IPv6 IP address"
else
    echo "oops"
fi

  또한 bash는 간소화된 루프문을 제공합니다. 100번 루프하고 싶다면 아래의 문법으로 해결할 수 있습니다.
for n in {1..100}
do
    echo $n
done

  아래와 같은 표현식으로 문자나 숫자를 범위로 지정하여 루프를 처리할 수도 있습니다. 꼭 1이나 a부터 시작할 필요는 없으며, 역순으로 처리하는 것도 가능합니다.
{a..z}
{z..a}
{c..f}
{5..25}
{10..-10}

  쉘에서 아래처럼 간단히 확인해볼 수도 있습니다.
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo {5..-1}
5 4 3 2 1 0 -1
2013/07/15 12:42 2013/07/15 12:42
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
Posted
Filed under 프로그램과 명령어/관리와 유지보수
참조 원문 : Setting Up Logrotate on RedHat Linux

1. 소개
  Logrotate는 로그가 많이 쌓이는 상용 서버를 관리하는 관리자를 위한 유틸리티로 디스크 공간을 아끼면서 시스템이 용량 부족으로 뻗는 것을 방지합니다. 일반적으로 이런 문제를 막는 방법은 /var 마운트 포인트를 별도의 파티션이나 로지컬 볼륨으로 설정하는 것이지만 logrotate는 로그 파일을 일정 조건에 따라 다음 파일로 순환시키고 관리하여 해결합니다. 기본적으로 logrotate는 /etc/cron.daily/에 있는 cron 파일을 통해 하루에 한 번씩 실행됩니다.
$ ls -al /etc/cron.daily/logrotate
-rwxr-xr-x 1 root root 372 12월  1  2012 /etc/cron.daily/logrotate

2. Logrotate 설정
  Logrotate를 설정하려면 아래 두 파일을 수정해야 합니다.
  • /etc/logrotate.conf
  • /etc/logrotate.d/ 디렉토리에 있는 서비스별 설정 파일
  /etc/logrotate.conf 파일은 일반 및 디폴트 설정을 담고 있습니다. 어떤 로그 파일에 대한 설정에서 관련 항목이 없다면 그 항목은 이 파일에 있는 내용을 따릅니다. 아래는 파일 내용의 예입니다.
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here
  • weekly : 로그 파일을 주 단위로 순환시킨다.
  • rotate 4 : 4주 분량의 로그 파일을 보관한다.
  • create : 순환 후 새로운 빈 로그 파일을 생성한다.
  • include : 해당 디렉토리에 있는 파일들을 읽어서 적용한다.
  /etc/logrotate.d/ 디렉토리에는 각 서비스별 설정 파일이 있습니다.

3. 새로운 서비스의 로그를 logrotate의 관리하에 두기
  /var/log/sample.log라는 로그 파일이 있고 이 파일을 매일 순환시키길 원한다고 가정하면 /etc/logrotate.d/ 디렉토리에 새로운 파일을 생성(파일명은 원하는 것으로 생성하나 보통은 서비스명을 사용)하여 아래의 내용을 작성하여 저장합니다.
/var/log/linuxcareer.log {
    missingok
    notifempty
    compress
    size 20k
    daily
    create 0600 root root
}
  참고로 같은 디렉토리에 있는 다수의 로그 파일에 같은 설정을 적용하길 원한다면 와일드카드(*)를 사용할 수 있습니다. 예를 들어 파일명에 /var/log/mylogs/*.log 라고 적는다면 /var/log/mylogs/ 디렉토리 안에 .log 확장자를 가진 모든 파일을 순환시킵니다.

  위의 예제에 있는 각 항목에 대한 설명은 아래와 같습니다.
  • missingok : 로그 파일이 없어도 에러를 출력하지 않습니다.
  • notifempty : 파일이 비어있다면 순환하지 않습니다.
  • compress : 순환 대상을 gzip으로 압축합니다.
  • size : 로그 파일의 크기가 20k보다 클 때만 순환합니다.
  • daily : 매일 순환합니다.
  • create : 퍼미션은 600, 소유자와 소유 그룹은 root로 새로운 로그 파일을 생성합니다.
  그 외에도 많은 옵션이 존재하며 man logrotate를 통해 확인할 수 있습니다.


2013/07/12 15:44 2013/07/12 15:44
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : How to Install and Setup Monit (Linux Process and Services Monitoring) Program

  Monit은 서버 프로세스, 파일, 디렉토리, 체크섬, 퍼미션, 파일시스템과 Apache, Nginx, MySQL, FTP, SSH, Sendmail 등 서비스를 모니터하고 관리하는 오픈 소스 툴입니다. 웹 인터페이스를 쓰고 있기 때문에 웹 서버가 필요하며 이를 이용해 시스템 상태를 보고, 프로세스를 제어할 수 있습니다.

Monit로 할 수 있는 것
  프로세스가 돌아가고 있지 않다면 시작할 수 있고, 반응이 없으면 재시작할 수 있으며, 자원을 많이 소모할 경우 중지할 수 있습니다. 또한 파일, 디렉토리, 파일시스템의 변화, 체크섬 변화, 파일 크기 변화, 타임스탬프의 변화를 감시할 수 있습니다. 그리고 원격 호스트의 TCP/IP 포트, 서버 프로토콜, ping을 감사하는 것도 가능합니다. 물론 자체적으로 로그를 기록하며 치명적인 에러와 복구 상태에 대해 경고합니다.


Monit 설치
  레드햇 계열의 경우 EPEL 저장소를 추가해야 합니다. 추가 후 yum으로 설치합니다.
# yum install monit
  데비안 계열은 apt-get으로 바로 설치합니다.
$ sudo apt-get install monit

Monit 설정
  기본적으로 2분마다 서비스를 검사하며 /var/log/monit 파일에 로그를 기록합니다. 웹 서버를 통해 2812 포트로 웹 인터페이스를 제공하며 이를 위해 monit 설정 파일을 수정해야 합니다. 주 설정 파일은 레드햇 계열의 경우 /etc/monit.conf, 데비안 계열의 경우 /etc/monit/monitrc 입니다. 이 파일 안에서 아래에 해당하는 부분의 주석을 제거하고 서버의 IP와 도메인을 입력합니다.
 set httpd port 2812 and
     use address localhost  # only accept connection from localhost
     allow localhost        # allow localhost to connect to the server and
     allow admin:monit      # require user 'admin' with password 'monit'
     allow @monit           # allow users of group 'monit' to connect (rw)
     allow @users readonly  # allow users of group 'users' to connect readonly
  그 후 monit 서비스를 재시작하여 새 설정을 읽도록 합니다.
$ sudo /etc/init.d/monit start
  이제 http://주소:2812로 웹 인터페이스에 접속할 수 있습니다. 사용자명엔 admin, 패스워드엔 monit을 넣어 로그인하면 아래와 같은 화면을 볼 수 있습니다.

출처 : 참조 원문


서비스 추가
  웹 인터페이스의 작동을 확인하면 레드햇 계열의 경우 /etc/monit.conf, 데비안 계열의 경우 /etc/monit/monitrc 파일의 끝부분에 감시할 프로그램을 추가합니다. 아래는 기본적인 설정 예제입니다.

Apache
check process httpd with pidfile /var/run/httpd.pid
group apache
start program = "/etc/init.d/httpd start"
stop program = "/etc/init.d/httpd stop"
if failed host 127.0.0.1 port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout
Apache2
check process apache with pidfile /run/apache2.pid
start program = "/etc/init.d/apache2 start" with timeout 60 seconds
stop program  = "/etc/init.d/apache2 stop"
Nginx
check process nginx with pidfile /var/run/nginx.pid
start program = "/etc/init.d/nginx start"
stop program = "/etc/init.d/nginx stop"
MySQL
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
group mysql
start program = "/etc/init.d/mysqld start"
stop program = "/etc/init.d/mysqld stop"
if failed host 127.0.0.1 port 3306 then restart
if 5 restarts within 5 cycles then timeout
SSH
check process sshd with pidfile /var/run/sshd.pid
start program "/etc/init.d/sshd start"
stop program "/etc/init.d/sshd stop"
if failed host 127.0.0.1 port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout

  감시할 프로그램에 대한 내용을 모두 추가한 후 아래 명령어로 틀린 부분이 없는지 확인합니다.
$ sudo monit -t
  이상이 없으면 서비스를 재시작합니다.
$ sudo /etc/init.d/monit restart
  로그 파일을 확인하여 서비스 시작에 문제가 없는지 확인할 수도 있습니다.
$ sudo tail -f /var/log/monit.log
[BDT Apr  3 03:06:04] info     : Starting monit HTTP server at [localhost:2812]
[BDT Apr  3 03:06:04] info     : monit HTTP server started
[BDT Apr  3 03:06:04] info     : 'tecmint.com' Monit started
[BDT Apr  3 03:06:04] error    : 'nginx' process is not running
[BDT Apr  3 03:06:04] info     : 'nginx' trying to restart
[BDT Apr  3 03:06:04] info     : 'nginx' start: /etc/init.d/nginx

출처 : 참조 원문

2013/07/12 10:45 2013/07/12 10:45
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Simple database load balancing with MySQL Proxy

  MySQL 프록시는 클라이언트와 SQL 서버 사이를 지나는 정보를 감사할 수 있으며 악성 질의로부터 MySQL 서버를 보호하거나 데이터베이스를 실제로 변경하지 않고도 클라이언트가 받을 정보를 바꾸기 위해 둘 사이에 흐르는 데이터를 변경할 수도 있습니다. 그 외에도 읽기 연산을 위한 서버를 추가하여 MySQL의 확정성을 높이고 MySQL 서버 사이에서 로드 밸런싱을 하면서 SELECT 문을 읽기 전용 슬레이브 서버로 보내도록 흐름을 최적화할 수 있습니다.

  대부분의 배포판에서 MySQL 프록시 패키지의 이름은 mysql-proxy입니다. CentOS의 경우 이 패키지는 EPEL 저장소에 있습니다. EPEL은 메인 CentOS 저장소에서 제공하지 않는 추가 패키지를 제공하는 저장소입니다. 이는 CentOS 6을 기준으로 아래 명령어를 통해 설치할 수 있습니다.
# rpm -ivh http://ftp-stud.hs-esslingen.de/pub/epel/6/i386/epel-release-6-8.noarch.rpm
  저장소를 추가하면 yum install mysql-proxy 명령어를 통해 설치할 수 있습니다.


설정
  레드햇 계열을 기준으로 MySQL Proxy의 설정 파일은 /etc/sysconfig/mysql-proxy 입니다. 설정 파일에서 아래와 같은 옵션을 설정할 수 있습니다.
  • ADMIN_USER - 프록시의 관리자 인터페이스를 위한 사용자. 디폴트 값으로 놔둔다.
  • ADMIN_PASSWORD - 관리자 계정의 패스워드 평문. 원하는 값으로 변경.
  • ADMIN_LUA_SCRIPT - Lua 프로그래밍 언어로 된 관리자 스크립트. 이 스크립트가 없으면 관리자 인터페이스가 작동하지 않는다. 디폴트 값으로 놔둔다.
  • PROXY_USER - 프록시를 돌릴 시스템 계정. 디폴트는 mysql-proxy며 그냥 놔둔다.
  • PROXY_OPTIONS - 로깅 레벨, 불러올 Lua 스크립트 등 프록시 옵션.
  가장 중요한 것은 PROXY_OPTIONS며 사용 예는 아래와 같습니다.
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.102:3306 --proxy-read-only-backend-addresses=192.168.1.105:3306 --proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua"
  로깅은 시스템의 syslog(--log-use-syslog)를 사용하여 info 레벨부터 기록(--log-level=info)하며 이는 프록시의 모든 시스템 메시지를 /var/log/messages 파일에 기록한다는 뜻입니다.

  2개의 플러그인을 쓰는데 하나는 기본 프록시 기능을 제공하는 플러그인(--plugins=proxy), 다른 하나는 백엔드 서버에 대한 유용한 정보를 사용자에게 관리자 인터페이스로 제공하는 플러그인(--plugins=admin)입니다.

  백엔드 서버는 하나의 읽기/쓰기 서버(--proxy-backend-adresses=192.168.1.102:3306)와 하나의 SELECT 문만 받는 읽기 전용 서버(--proxy-read-only-backend-addresses=192.168.1.105:3306)로 구성합니다. 읽기 전용 서버는 마스터 읽기/쓰기 서버의 리플리케이션 서버여야 합니다. MySQL 리플리케이션 디자인에 따라 더 많은 읽기/쓰기 서버를 추가할 수 있으며, 모든 질의는 라운드로빈 알고리즘으로 공평히 분배합니다. 프록시는 죽은 서버에 질의를 넘기지 않기 때문에 로드 밸런싱과 패일오버 모두에 유용합니다
.
  마지막 설정(--proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua)은 읽기와 쓰기 사이에서 질의를 분배하는 Lua 스크립트의 위치입니다. 이는 MySQL 프록시의 가장 유용한 기능 중 하나로서 마스터 MySQL 서버의 부하를 줄이기 위해 SELECT 문을 읽기에 최적화된 슬레이브 서버로 보내는 역할을 합니다.

  하지만 이 Lua 스크립트는 EPEL 패키지에 기본으로 포함되어 있지 않습니다. 이 스크립트는 공식 MySQL 프록시 패키지를 통해 얻을 수 있습니다. 다운로드 옵션에서 generic Linux archive를 받아 압축을 풀면 디렉토리가 생기며 그 밑에 있는 share/doc/mysql-proxy 디렉토리에서 rw-splitting.lua 파일을 찾을 수 있습니다. 그 파일을 프록시 서버의 /usr/lib/mysql-proxy/lua/proxy/ 디렉토리에 복사합니다.


모니터링
  설정이 모두 끝나면 CentOS를 기준으로 아래 명령어를 통해 MySQL 프록시를 시작합니다.
# mysql proxy start
  시작에 성공했다면 /var/log/messages 파일에 아래와 비슷한 출력이 남을 것입니다.
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) mysql-proxy 0.8.2 started
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) proxy listening on port :4040
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) added read/write backend: 192.168.1.102:3306
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) added read-only backend: 192.168.1.105:3306
  지금 설정한 프록시를 테스트하려면 앞서 설명한 것처럼 MySQL 리플리케이션이 설정되어 있어야 합니다.

  프록시가 활동을 시작하면 MySQL 클라이언트로 서버의 4041 포트에 접속하여 관리자 인터페이스를 통해 상태를 확인할 수 있습니다. 만약 MySQL 프록시의 IP 주소가 192.168.1.201이라면 아래의 명령어로 프록시의 관리자 인터페이스에 접속할 수 있습니다. 관리자 로그인 ID와 패스워드는 /etc/sysconfig/mysql-proxy 파일에 정의한 것을 사용합니다.
$ mysql --host=192.168.1.201 --port=4041 -u admin -p
  관리자 인터페이스는 단순하며 Lua 관리자 스크립트에 따라 보통은 아래의 명령어만 사용할 수 있습니다.
SELECT * FROM backends;
  MySQL 프록시가 제대로 작동 중이라면 아래와 같은 결과가 나와야 합니다.
+-------------+--------------------+-------+------+------+-------------------+
| backend_ndx | address            | state | type | uuid | connected_clients |
+-------------+--------------------+-------+------+------+-------------------+
|           1 | 192.168.1.102:3306 | up    | rw   | NULL |                 0 |
|           2 | 192.168.1.105:3306 | up    | ro   | NULL |                 0 |
+-------------+--------------------+-------+------+------+-------------------+
2013/07/07 15:39 2013/07/07 15:39
Posted
Filed under 프로그램과 명령어/네트워크와 보안
참조 원문 : Using OpenSSL to encrypt messages and files on Linux

  OpenSSL로 키를 만들어 사용하는 건 많이 볼 수 있어도 직접 암호화에 사용하는 경우는 은근히 없죠. 여기서는 OpenSSL로 파일을 직접 암호화하는 방법과 복호화하는 방법을 알아보겠습니다.

1. 메시지 암복호화
  파일을 암호화하기 전에 메시지를 암복호화하는 방법을 먼저 알아보겠습니다. 아래는 문자열을 Base64 인코딩으로 암호화하는 명령어입니다.
$ echo "abc" | openssl enc -base64
YWJjCg==
  출력 결과가 암호화된 결과입니다. 복호화할 땐 -d 옵션을 붙입니다.
$ echo "YWJjCg==" | openssl enc -base64 -d
  근데 키를 사용하지 않은 암호화이므로 사실상 의미가 없죠. 키를 사용한 암호화 예는 다음과 같습니다.
$ echo "OpenSSL" | openssl enc -aes-256-cbc -a
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX1/JemLPx7cmSW3Ik8M2Od7kSRvTW+BuI8w=
  키를 사용한 복호화 예는 아래와 같습니다.
echo "U2FsdGVkX1/JemLPx7cmSW3Ik8M2Od7kSRvTW+BuI8w=" | openssl enc -aes-256-cbc -d -a
enter aes-256-cbc decryption password:
OpenSSL
  파일로 입출력하는 방법은 아래와 같습니다.
$ echo "OpenSSL" | openssl enc -aes-256-cbc > openssl.dat
$ openssl enc -aes-256-cbc -d -in openssl.dat

2. 파일 암복호화
  위 방법과 비슷한데 차이가 있다면 echo 대신 -in 옵션과 -out 옵션으로 암복호할 파일을 선택하는 것입니다.
$ openssl enc -aes-256-cbc -in /etc/services -out services.dat
$ openssl enc -aes-256-cbc -d -in services.dat > services.txt
enter aes-256-cbc decryption password:

3. 디렉토리 암복호화
  그냥 tar로 묶어서 넘기고, 넘기받아 푸는 방법입니다.
# tar cz /etc | openssl enc -aes-256-cbc -out etc.tar.gz.dat
tar: Removing leading `/' from member names
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

# openssl enc -aes-256-cbc -d -in etc.tar.gz.dat | tar xz
enter aes-256-cbc decryption password:

4. 공개키와 개인키 사용방법
  먼저 개인키와 공개키를 생성합니다.
개인키를 생성
$ openssl genrsa -out private_key.pem 1024
Generating RSA private key, 1024 bit long modulus
............................++++++
..........++++++
e is 65537 (0x10001)

개인키를 이용해 공개키를 생성
$ openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout
writing RSA key
공개키로 암호화하는 방법은 아래와 같습니다.
$ openssl rsautl -encrypt -inkey public_key.pem -pubin -in encrypt.txt -out encrypt.dat
개인키로 복호화하는 방법은 아래와 같습니다.
$ openssl rsautl -decrypt -inkey private_key.pem -in encrypt.dat -out new_encrypt.txt
2013/07/07 13:07 2013/07/07 13:07