forcemax's

참조글 : http://ubuntuforums.org/showthread.php?t=786095

0. prepare
# sudo apt-get update
# sudo apt-get install sudo apt-get install build-essential git-core checkinstall yasm texi2html libfaac-dev libjack-jackd2-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libsdl1.2-dev libtheora-dev libvorbis-dev libvpx-dev libx11-dev libxfixes-dev libxvidcore-dev zlib1g-dev

1. x264 installation
# cd
# git clone git://git.videolan.org/x264.git
# cd x264
# ./configure
# make
# sudo checkinstall --pkgname=x264 --pkgversion="2:0.$(grep X264_BUILD x264.h -m1 | \
   cut -d' ' -f3).$(git rev-list HEAD | wc -l)+git$(git rev-list HEAD -n 1 | \
   head -c 7)" --backup=no --deldoc=yes --fstrans=no --default


2. ffmpeg installation
# cd
# git clone git://git.ffmpeg.org/ffmpeg.git
# cd ffmpeg
# ./configure --enable-gpl --enable-version3 --enable-nonfree --enable-postproc \
    --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb \
    --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis \
    --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab
# make
# sudo checkinstall --pkgname=ffmpeg --pkgversion="5:$(./version.sh)" --backup=no \
    --deldoc=yes --fstrans=no --default
# hash x264 ffmpeg ffplay ffprobe




IBM Thinkpad X60에서 Ubuntu 10.04에서 10.10으로 업그레이드를 완료하고 리부팅을 한후에 사용하려고 보니, 화면이 이상하게 나오고 있었다.
10.04에서도 intel driver 관련하여 문제가 있었는데 또 발생했다. ㅠ.ㅜ
이번에는 지난번에 발생한 문제와 상황이 좀 다른듯하여 구글님의 도움을 받아보기로 하였다.

관련 페이지는 아래 참조 링크.

결론은 xorg-edgers PPA를 추가하고 패키지를 업데이트하면 된다는 것이다.

다음의 명령 몇개 입력해주고 재부팅하면 끝.

$ sudo apt-add-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ sudo apt-get upgrade

만약 위의 방법으로 패키지를 업데이트 했는데도 문제가 해결이 안되었을 경우, 일단 업데이트한 패키지를 제거하기 위해서 다음의 명령을 입력해준다.

$ sudo ppa-purge xorg-edgers

참조 : https://bugs.launchpad.net/ubuntu/+source/xserver-xorg-video-intel/+bug/619663

한국전력 전기요금 수납

http://cyber.kepco.co.kr/cyber/common/popup/pop_card_pay.jsp?gubun=C


지방세 및 수도요금 수납

http://etax.seoul.go.kr/

/etc/init.d/iptables를 다음과 같이 만든다. (permission은 775)

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    networking ifupdown $local_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

IPTABLES=/sbin/iptables
EXT_ETH=eth0

${IPTABLES} -F
${IPTABLES} -t nat -F
${IPTABLES} -X BLACKLISTCHECK

${IPTABLES} -P INPUT ACCEPT
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -P FORWARD ACCEPT

${IPTABLES} -A INPUT -j ACCEPT -i lo
${IPTABLES} -A INPUT -j ACCEPT -p icmp --icmp-type any
${IPTABLES} -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED

${IPTABLES} -N BLACKLISTCHECK
${IPTABLES} -A INPUT -j BLACKLISTCHECK -i ${EXT_ETH} -m state --state NEW -p tcp --dport 22

for x in `cat /tmp/ssh_evil`; do
${IPTABLES} -I BLACKLISTCHECK -s $x -j DROP
done

# 80, 22번 포트만 오픈
${IPTABLES} -A INPUT -j ACCEPT -i ${EXT_ETH} -m state --state NEW -p tcp --dport 22
${IPTABLES} -A INPUT -j ACCEPT -i ${EXT_ETH} -m state --state NEW -p tcp --dport 80

${IPTABLES} -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
${IPTABLES} -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 6 -j LOG --log-prefix "SSH_brute_force "

${IPTABLES} -A INPUT -j REJECT --reject-with icmp-host-prohibited

/etc/init.d/swatch 파일이 없다면 다음의 내용으로 생성한다. (permission은 775)
#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          swatch
# Required-Start:    networking ifupdown $local_fs
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

PATH="/sbin:/bin:/usr/sbin:/usr/bin"
NAME="swatch"
DAEMON="/usr/bin/swatch"
DESC="simple watcher"
CONFFILE="/etc/swatch.conf"
#LOGFILE="/var/log/secure"
LOGFILE="/var/log/syslog"
PIDFILE="/var/run/swatch.pid"
OPTS="--config-file=$CONFFILE --tail-file=$LOGFILE --pid-file=$PIDFILE --awk-field-syntax --tail-args='-F' --daemon"

test -x $DAEMON || exit 0

start() {
    if [ ! -f "$CONFFILE" ]; then
        echo "Error: $CONFFILE does not exist."
        exit 1
    fi
    if [ ! -f "$LOGFILE" ]; then
        echo "Error: $LOGFILE does not exist."
        exit 1
    fi
    if [ -f "$PIDFILE" ]
    then
        echo "Error: $NAME is already running."
    else
        $DAEMON $OPTS >/dev/null 2>&1
    fi
}

stop() {
    if [ -f "$PIDFILE" ]
    then
        PID=`cat $PIDFILE`
        if ps h $PID > /dev/null
        then
            pkill -P $PID
            kill $PID
        else
            echo "Error: $NAME is not running, but PID file exists. Deleting it."
        fi
        rm -f $PIDFILE
    else
        echo "Error: $NAME is not running."
    fi
}

case "$1" in
  start)
    echo "Starting $DESC: $NAME"
    start
    ;;
  stop)
    echo "Stopping $DESC: $NAME"
    stop
    ;;
  restart)
    echo "Restarting $DESC: $NAME"
    stop
    sleep 1
    start
    ;;
  *)
    echo "Usage: $0 start|stop|restart"
    exit 1
    ;;
esac

exit 0

swatch.conf에는 다음을 추가한다.
perlcode my $sshscript = '/root/swatch-ssh';
watchfor /([a-zA-Z]{3})\s+([0-9]{1,2}) ([0-9]{2}:[0-9]{2}:[0-9]{2}) ([a-zA-Z0-9_-]+) kernel: \[.*\] SSH_brute_force .*SRC=(.*) DST=/
        exec "$sshscript '$*' >> /var/log/swatch.log"
        throttle 00:00:30

swatch에서 실행할 스크립트를 만든다.
/root/swatch-ssh 파일의 내용은 다음처럼 구성한다. (역시 permission은 775)
(다른 기능도 같이 하는 스크립트에서 일부만 발췌함)
#!/usr/bin/ruby1.8

if ARGV.length==0 && ARGV.length < 2
  puts "Error!! Argument must more than 1 words!!"
  puts "ex) swatch-ssh message"
  exit 1
else
  begin
    message = ""
    argv_msg = ARGV[0].split
    host = argv_msg[3]

    beginflag = false
    for qs in argv_msg do
      message = message + (message!=""?" ":"") + qs if beginflag == true
      beginflag = true if qs == host
    end

    # for 3ware modules message
    message.sub!(/kernel: \[[0-9\s]+\.[0-9]+\] /, '')
    message.sub!(/\(.*\)/, '')

    smsmessage = sprintf("[%s]%s\n", host, message)
#    smsmessage.gsub!(' ', '_')
    smsmessage.sub!(/\[mgm\]/, '')
    smsmessage.sub!(/SSH_brute_force .* SRC=/, '')
    smsmessage.sub!(/ DST=.*/, '')

    File.open("/tmp/ssh_deny", 'a') {|f| f.write(smsmessage) }
    command = sprintf("cat /tmp/ssh_evil /tmp/ssh_deny | sort -u > /tmp/ssh_uniq_evil ; rm /tmp/ssh_deny ; cp /tmp/ssh_uniq_evil /tmp/ssh_evil ; /etc/init.d/iptables")
#    printf("%s\n", command)
    system(command)
  end
end

exit 0

이제 모든 준비는 완료되었습니다.
iptables 스크립트를 실행시키고 swatch를 restart하면 끝.
iptables -N BLACKLISTCHECK
touch /tmp/ssh_evil
update-rc.d iptables defaults 20
update-rc.d swatch defaults 20
/etc/init.d/iptables
/etc/init.d/swatch restart

위에서 설정한 내용은 다음과 같습니다.

1. iptables를 설정하여 ssh 연결이 1분에 6번 이상 연결되면 kernel에 log를 남기게 됩니다.
2. swatch에서는 iptables가 남긴 kernel log를 발견하게 되면 /root/swatch-ssh 스크립트를 실행시킵니다.
3. /root/swatch-ssh 스크립트에서는 해당 IP Address를 /tmp/ssh_evil 파일에 남기는 동시에 /etc/init.d/iptables 스크립트를 실행시켜서 발견된 IP Addreess를 통해서 들어오는 연결을 차단합니다.

위의 1,2,3 과정을 반복하면서 ssh brute force attack이 발견되면 해당 IP Address를 지속적으로 차단합니다.

작성자 : 저입니다. ^^

- OpenLDAP에 계정추가하기

먼저 ldif 파일을 다음과 같이 만든다.
dn: uid=ldapaddtest,ou=people,dc=domain,dc=com
uid: ldapaddtest
cn: ldapaddtest
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: e2NyeXB0fSQxJG4wOXM0N3FFJE9JUlI4R1pJNjduZ2Q3UXJ5VThPZDE=
loginShell: /bin/bash
uidNumber: 10067
gidNumber: 100
homeDirectory: /home/ldapaddtest

다음 명령으로 위의 파일에 있는 계정을 추가한다.
ldapadd -x -D "cn=admin,dc=domain,dc=com" -W -h localhost -f useradd.ldif

위 명령을 실행시키면 비밀번호를 물어본다. /etc/ldap.secret 파일에 있는 비밀번호를 입력한다.

- 이제 비밀번호를 변경할 차례

luma를 설치하고 실행한다.

sudo aptitude install luma

crypt 패스워드를 얻기 위해서는 다음과 같이 입력한다.
openssl passwd -crypt 1234


luma에서 위에 추가한 계정으로 이동한 후에 패스워드 필드를 수정을 선택하고 'crypt' 방식으로 패스워드를 변경해준다.

이렇게하면 계정 추가 끝

** 위에 ldapadd 명령에 -x가 붙어있다. -x는 sasl을 사용하지 않게 해준다.

위에 계정이 제대로 추가되었는지 확인하려면

ldapsearch -x -D "cn=admin,dc=domain,dc=com" -W -L "uid=ldapaddtest"


MySQL Proxy

작업2010. 3. 29. 14:15
MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication.

https://launchpad.net/mysql-proxy

http://forge.mysql.com/wiki/MySQL_Proxy

MySQL에 fail-over와 load balancing(round-robin)을 하기 위한 가장 쉬운 도구.

MySQL에 MyISAM으로 DB를 운영중에 간혹 "Sending data" 상태에서 1분이상 시간이 소요되는 경우가 있다.

이 때문에 Table에 Lock이 걸려 다른 Query들이 다 대기상태가 된다.

MySQL의 Query Caching 시스템에 문제가 있을 수 있으니 query cache를 off해 보란다.

http://bugs.mysql.com/bug.php?id=45544

뭐.. 나아지기만 바란다 ㅠㅠ

PS. 그러나 제일 중요한건 Slow Query가 발생하는 원인이 되는 Query를 수정하는 것이지 않을까. ㅎㅎ

FreeBSD에서 PF 사용할 방법을 찾던 중 한글로 보기 쉽게 정리된 페이지를 찾았다.

http://mix1009.net/entry/BSD-방화벽-PF-DDoS방어

요즘 FreeBSD를 자주 손대게 되는게 참.. 알면 알수록 어려운 OS란 생각이 든다.

현재 openafs를 사용하는 시스템이 xen위에 올라와 있어서 가끔 이상동작을 하기는 하지만 이번에는 다음과 같은 에러가 발생해서 좀 알아보았다.

Found system call table at 0xc03226c0 (pattern scan)
sysctl_check_dir: failed: /afs .1 ref: /kernel .1
sysctl table check failed: /afs .1 Inconsistent directory names

현재 운영중인 OS는 Ubuntu 8.04 LTS Hardy Heron이며 다음과 같이 작업하여 문제를 해결하였다. 64bit amd64를 사용중이다.
cd /usr/src

wget http://mirrors.kernel.org/ubuntu/pool/universe/o/openafs/openafs-modules-source_1.4.11+dfsg-4_amd64.deb

mv modules modules.old

dpkg -i openafs-modules-source_1.4.11+dfsg-4_amd64.deb

## module-assistant를 실행해서 openafs-modules를 build하고 설치

m-a -t a-i openafs-modules-source


원인은 아마 Ubuntu 8.04와 openafs 1.4.6이 호환성이 좋지 않아서가 아닐까하는 추측만 남았다.