[root@localhost cron.daily]# vim sqlBackup.sh
#!/bin/bash
_DB_PASS='password'
_BACKUP_DIR='/backup/sqlBackup/'
find $_BACKUP_DIR* -mtime +7 -exec rm -fr {} \; > /dev/null 2>&1
db_list=`echo "show databases;" | mysql -N -uroot -p${_DB_PASS}`
eval `date "+day=%d; month=%m; year=%Y"`
INSTD="$_BACKUP_DIR/sql-backup-$year-$month-$day"
mkdir -p $INSTD
for db in $db_list; do
if [ ! -d $INSTD/$db ]
then
mkdir $INSTD/$db
fi
table_list=`echo "show tables" | mysql -N -uroot -p${_DB_PASS} $db`
for table in $table_list; do
mysqldump -uroot -p${_DB_PASS} --lock-all-table --opt --quick --quote-names $db $table > $INSTD/$db/${table}.sql
done
done
2016년 12월 15일 목요일
mysql(mariadb) 테이블별 mysqldump 백업
디비별 디렉토리를 만들고, 테이블별 .sql 파일을 만든다.
2016년 12월 12일 월요일
L2 스위치에서 포트 매핑
MRTG의 생성 할 때 골치 아픈 것중에 하나가 스위치의 각 포트별 서버가 어떤 서버인가 하는 것이다.
보통 MRTG는 스위치의 포트에 걸기 때문이다. 서버에 snmp를 설치하여 만들 수도 있지만, 서버의 접근 권한이 없는 경우도 많기 때문이다.
신입시절에는 그냥 랜선을 눈을 따라가서, 하나씩 기록하고 그걸로 등록하곤 했다.
이게 너무 불편한게 일단 IDC를 가야되고, 혼자서는 스위치와 서버에 연결된 랜선이 어떤 건지 확인하기가 매우 어렵다. 두명은 같이 가야 확인이 용이하다.
포트매핑 프로그램을 알고 나서는 한결 편해졌다. L2와 L3 스위치의 snmp 만 알면 L2스위치의 몇번 포트에 몇번 IP 가 할당되어 있는 지 바로 확인이 가능하기 때문이다.
그런데 이번에 L3 스위치가 없는 네트워크 작업이 있었다. L3가 없는 건 아니지만 IDC 소유라 접근 권한이 없다.
네트워크 작업은 L2 스위치를 교체한 것인데, 시스코의 2950 모델이다.
이것저것 알아보다 보니 스위치에서 'sh arp' 명령어가 가능 했다.
L2 스위치는 mac-address-table만 있는 줄 알았는데, 그게 아니였다.
그럼 역시 간단 하다.
arp 테이블(sh arp)의 mac과 mac-addres-table(sh mac-addres-table)의 mac 값을 비교하면 어느 포트가 어떤 아이피를 가지고 있는 지 알 수 있다.
포트 매핑 프로그램에 L3부분과 L2 부분을 같은 L2 스위치를 넣고 비교할 수도 있다.
L2의 arp 테이블에는 대개 자신의 IP와 게이트웨이에 IP 밖에 없을 것이다.
왜냐면 같은 네트워크 대역에 대해서는 물어봐 주는 사람이 없기 때문이다. 자신의 IP는 고정이라 제외하고, 포트에 물린 서버들은 통신할 때, 게이트웨이만 찾기 때문이다. 대개 외부로 나가는 연결일 것이다.
생각해보니 매핑 프로그램에서 L3란게 의미를 가지는 게 아니라 그 스위치가 게이트웨이 역할을 하기 때문에 의미가 있는 것 같다.
arp 테이블에 내가 원하는 서버의 IP를 넣어보자.
L2스위치에서 찾으려고 하는 서버의 IP에 핑을 날려보자. 그리고 arp 테이블을 확인 하면 IP가 등록되어 있을 것이다. 하위단의 서버에서 ping을 날려도 L2스위치에 등록된다.
문제는 ping을 막아 놓은 곳도 많은 게 문제인데, 이럴 때는 telnet을 이용해 보자. ping을 막아 놓은 서버가 웹서버라면 80포트는 열렸을 것이다.
해당 서버에 연결이 되었다.
그리고 다시 arp 테이블 확인하면 역시 등록이 되었다.
스위치 포트별 서버의 IP를 체크하기 위해 직접 랜선을 일일이 비교하는 작업은 안해도 된다.
보통 MRTG는 스위치의 포트에 걸기 때문이다. 서버에 snmp를 설치하여 만들 수도 있지만, 서버의 접근 권한이 없는 경우도 많기 때문이다.
신입시절에는 그냥 랜선을 눈을 따라가서, 하나씩 기록하고 그걸로 등록하곤 했다.
이게 너무 불편한게 일단 IDC를 가야되고, 혼자서는 스위치와 서버에 연결된 랜선이 어떤 건지 확인하기가 매우 어렵다. 두명은 같이 가야 확인이 용이하다.
포트매핑 프로그램을 알고 나서는 한결 편해졌다. L2와 L3 스위치의 snmp 만 알면 L2스위치의 몇번 포트에 몇번 IP 가 할당되어 있는 지 바로 확인이 가능하기 때문이다.
그런데 이번에 L3 스위치가 없는 네트워크 작업이 있었다. L3가 없는 건 아니지만 IDC 소유라 접근 권한이 없다.
네트워크 작업은 L2 스위치를 교체한 것인데, 시스코의 2950 모델이다.
이것저것 알아보다 보니 스위치에서 'sh arp' 명령어가 가능 했다.
L2 스위치는 mac-address-table만 있는 줄 알았는데, 그게 아니였다.
그럼 역시 간단 하다.
arp 테이블(sh arp)의 mac과 mac-addres-table(sh mac-addres-table)의 mac 값을 비교하면 어느 포트가 어떤 아이피를 가지고 있는 지 알 수 있다.
포트 매핑 프로그램에 L3부분과 L2 부분을 같은 L2 스위치를 넣고 비교할 수도 있다.
L2의 arp 테이블에는 대개 자신의 IP와 게이트웨이에 IP 밖에 없을 것이다.
왜냐면 같은 네트워크 대역에 대해서는 물어봐 주는 사람이 없기 때문이다. 자신의 IP는 고정이라 제외하고, 포트에 물린 서버들은 통신할 때, 게이트웨이만 찾기 때문이다. 대개 외부로 나가는 연결일 것이다.
생각해보니 매핑 프로그램에서 L3란게 의미를 가지는 게 아니라 그 스위치가 게이트웨이 역할을 하기 때문에 의미가 있는 것 같다.
arp 테이블에 내가 원하는 서버의 IP를 넣어보자.
L2스위치에서 찾으려고 하는 서버의 IP에 핑을 날려보자. 그리고 arp 테이블을 확인 하면 IP가 등록되어 있을 것이다. 하위단의 서버에서 ping을 날려도 L2스위치에 등록된다.
문제는 ping을 막아 놓은 곳도 많은 게 문제인데, 이럴 때는 telnet을 이용해 보자. ping을 막아 놓은 서버가 웹서버라면 80포트는 열렸을 것이다.
telnet SERVER_IP 80
해당 서버에 연결이 되었다.
그리고 다시 arp 테이블 확인하면 역시 등록이 되었다.
스위치 포트별 서버의 IP를 체크하기 위해 직접 랜선을 일일이 비교하는 작업은 안해도 된다.
2016년 12월 8일 목요일
이벤트 실패 로그에 있는 공격 IP 뽑아내기.
이벤트 로그에 지속적인 공격이 들어오는 게 보인다. ㅅㅂㄹㄷ
이벤트 로그를 한개 한개 뒤져서 체크 하기가 힘들다.
예전에 작성했던 자동 차단 파워쉘을 조금 수정해서 목록만 뽑도록 만듬.
원격데스크탑(RDP)
MSSQL
로그 예제 : 사용자 'sa'이(가) 로그인하지 못했습니다. 원인: 암호가 제공된 로그인의 암호와 일치하지 않습니다. [클라이언트: 211.41.41.203]
언제 한번 날 잡아서 완성형으로 만들어야 될 듯...
이벤트 로그를 한개 한개 뒤져서 체크 하기가 힘들다.
예전에 작성했던 자동 차단 파워쉘을 조금 수정해서 목록만 뽑도록 만듬.
원격데스크탑(RDP)
###################### Config ######################
#아래의 형식으로 있는 IP 주소를 가져오기 위한 정규식
$regex2 = [regex] "원본 네트워크 주소:\t(\d+\.\d+\.\d+\.\d+)";
#아래 값 이상인 것만 차단 리스트($blacklist)에 추가
$deny_count = 5
#이벤트 로그가 많을 경우 어마무시하게 오래 걸림. 불러올 로그 개수
$newest = 1000
###################### Config ######################
##최종 공격자 IP 배열
$blacklist = @();
#초기화
$list=""
#메인 명령어( 이 스크립트의 코어임.)
#이벤트 실패 로그인 4625 ID 에서 아이피가 있는 message 부분에서 IP만 뽑아낸다.
#list 변수 = 이벤트 실패 로그 아이피 (중복포함)
$ips = get-eventlog Security -Newest $newest | Where-Object {$_.EventID -eq 4625 } | foreach {
$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip;
} | Sort-Object | Tee-Object -Variable list | Get-Unique
# ($list | Select-String 211.217.48.254 -SimpleMatch | Measure-Object).count;
foreach ($forIp in $ips) {
#로그인 실패 이벤트 로그 중에는 IP가 없는 것들도 있는 데, 그런 경우
#빈값이 들어오므로 continue로 넘겨준다.
if([string]::IsNullOrEmpty($forIp))
{
#'continue';
continue;
}
if (-not ($blacklist -contains $forIp)) {
$attack_count = ($list | Select-String $forIp -SimpleMatch | Measure-Object).count;
"Found RDP attacking IP on 3389: " + $forIp + ", with count: " + $attack_count;
if ($attack_count -ge $deny_count) {$blacklist = $blacklist + $forIp;}
}
}
""
"========$deny_count 회 이상 실패 IP==============="
#방화벽 등록 명령어를 이용해서 자동 차단으로 해도 된다.
$blacklist
MSSQL
로그 예제 : 사용자 'sa'이(가) 로그인하지 못했습니다. 원인: 암호가 제공된 로그인의 암호와 일치하지 않습니다. [클라이언트: 211.41.41.203]
###################### Config ######################
#아래의 형식으로 있는 IP 주소를 가져오기 위한 정규식
$regex2 = [regex] "클라이언트: (\d+\.\d+\.\d+\.\d+)";
#아래 값 이상인 것만 차단 리스트($blacklist)에 추가
$deny_count = 5;
#이벤트 로그가 많을 경우 어마무시하게 오래 걸림. 불러올 로그 개수
$newest = 1000
###################### Config ######################
##최종 공격자 IP 배열
$blacklist = @();
#초기화
$list=""
#메인 명령어( 이 스크립트의 코어임.)
#이벤트 실패 로그인 18456 ID 에서 아이피가 있는 message 부분에서 IP만 뽑아낸다.
#list 변수 = 이벤트 실패 로그 아이피 (중복포함)
$ips = get-eventlog Application -Newest $newest | Where-Object {$_.EventID -eq 18456 } | foreach {
$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip;
} | Sort-Object | Tee-Object -Variable list | Get-Unique
# ($list | Select-String 211.217.48.254 -SimpleMatch | Measure-Object).count;
foreach ($forIp in $ips) {
#로그인 실패 이벤트 로그 중에는 IP가 없는 것들도 있는 데, 그런 경우
#빈값이 들어오므로 continue로 넘겨준다.
if([string]::IsNullOrEmpty($forIp))
{
#'continue';
continue;
}
if (-not ($blacklist -contains $forIp)) {
$attack_count = ($list | Select-String $forIp -SimpleMatch | Measure-Object).count;
"Found RDP attacking IP on MSSQL: " + $forIp + ", with count: " + $attack_count;
if ($attack_count -ge $deny_count) {$blacklist = $blacklist + $forIp;}
}
}
""
"========$deny_count 회 이상 실패 IP==============="
#방화벽 등록 명령어를 이용해서 자동 차단으로 해도 된다.
$blacklist
언제 한번 날 잡아서 완성형으로 만들어야 될 듯...
2016년 12월 7일 수요일
디렉토리를 심볼릭링크 생성시 여러개가 만들어지는 원인.
디렉토리를 ln -s 명령으로 심볼릭 링크로 만들 때, 두 번 실행시 dest 폴더 안에 원하지 않는 링크가 생긴다.
명령을 두번 실행하면 첫번째 명령에서 만들어진 '심볼릭 링크 디렉토리'안에 또하나의 파일이 생긴다.
세번째부터는 깨진 파일이라도 있으니까 그 아래로는 더 이상 생성되지 않는다.
이럴 때는 -n 명령을 써보자
-n 옵션의 설명은 다음과 같다.
-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory
디렉토리의 심볼릭 링크면 일반 파일로 취급한다고 한다.
테스트 해보자.
n 옵션이 없으면 아래와 같이 두번까지 정상 실행되며, 세번째부터 에러가 나온다.
dirSym 으로 들어가 보면 깨진 dirSrc 심볼릭 링크가 만들어져있다.
dirSym 링크를 지우고 n 옵션을 주고 다시 실행하면 아래와 같이 두번째에 에러가 발생한다.
결론 : 디렉토리를 symbolic link로 만들 때는 n 옵션을 추가해서 만들자.
명령을 두번 실행하면 첫번째 명령에서 만들어진 '심볼릭 링크 디렉토리'안에 또하나의 파일이 생긴다.
세번째부터는 깨진 파일이라도 있으니까 그 아래로는 더 이상 생성되지 않는다.
이럴 때는 -n 명령을 써보자
-n 옵션의 설명은 다음과 같다.
-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory
디렉토리의 심볼릭 링크면 일반 파일로 취급한다고 한다.
테스트 해보자.
n 옵션이 없으면 아래와 같이 두번까지 정상 실행되며, 세번째부터 에러가 나온다.
dirSym 으로 들어가 보면 깨진 dirSrc 심볼릭 링크가 만들어져있다.
[root@df tmp]# mkdir dirSrc
[root@df tmp]# ln -s dirSrc dirSym
[root@df tmp]# ln -s dirSrc dirSym
[root@df tmp]# ln -s dirSrc dirSym
ln: failed to create symbolic link `dirSym/dirSrc': 파일이 있습니다
dirSym 링크를 지우고 n 옵션을 주고 다시 실행하면 아래와 같이 두번째에 에러가 발생한다.
[root@df tmp]# rm dirSym
rm: remove 심볼릭 링크 `dirSym'? y
[root@df tmp]# ln -sn dirSrc dirSym
[root@df tmp]# ln -sn dirSrc dirSym
ln: failed to create symbolic link `dirSym': 파일이 있습니다
결론 : 디렉토리를 symbolic link로 만들 때는 n 옵션을 추가해서 만들자.
ln -sn src dest
2016년 11월 29일 화요일
Predictive Failure 란?
HP 서버중 한대에서 디스크 에러가 났다.
Predictive Failure
문구 자체가 참 애매하다. 에러가 난 것도 아니고
에러가 날 거란 걸 예측해 주는 거라는 데, 그 원리가 무엇인지 궁금했다.
영문 위키에서 찾을 수 있었다.
드라이브의 측정 된 값과 사전정의 된 임계값과 비교하여 상태를 평가한다고 되어 있다.
참고 : http://comfix.kr/162
physicaldrive 1I:1:7 (port 1I:box 1:bay 7, SAS, 300 GB, Predictive Failure)
physicaldrive 1I:1:8 (port 1I:box 1:bay 8, SAS, 300 GB, OK)
Predictive Failure
문구 자체가 참 애매하다. 에러가 난 것도 아니고
에러가 날 거란 걸 예측해 주는 거라는 데, 그 원리가 무엇인지 궁금했다.
영문 위키에서 찾을 수 있었다.
he drive firmware compares the measured parameters against predefined thresholds and evaluates the health status of the drive.
드라이브의 측정 된 값과 사전정의 된 임계값과 비교하여 상태를 평가한다고 되어 있다.
참고 : http://comfix.kr/162
2016년 11월 25일 금요일
logrotate가 안될 때...
오랜만에 서버 점검을 하니 messages 로그가 비정상으로 크다.
무려 1.8G!
접근 시도가 많은 것으로 알고 failer들 차단하고 나섰는 데, 뭔가 이상하다.
로그 파일이 messages밖에 없다. 기본적으로 rotate가 돌아서 messages.1이나
messages-날짜, 이런 형식으로 있어야 되는 데, 없다.
rotate가 안되고 있다!!.
아래 명령어로 확인. -d 옵션이 debug 모드.
출력 내용중 아래와 같이 이상점 발견
로테이트가 필요없다고!? 2G에 육박하고 있는 데 무슨 소리야.
logrotate는 /var/lib/logrotate.status 파일의 내용을 참조하여 rotate를 한다.
해당 파일을 살펴보니 내용이 없다.
열심히 검색 했으나, 원인은 찾을 수가 없다.
해결법은 아래 명령어로 rotate를 강제 적용 하는 것이다.
위와 같이 하면 /var/lib/logrotate.status 내용이 정상 서버와 같이 만들어지고,
아래와 같이 로테이트 된다. 기존 파일을 분할하는 건 아니다.
무려 1.8G!
-rw-------. 1 root root 1915638280 2016-11-25 09:01 messages
접근 시도가 많은 것으로 알고 failer들 차단하고 나섰는 데, 뭔가 이상하다.
로그 파일이 messages밖에 없다. 기본적으로 rotate가 돌아서 messages.1이나
messages-날짜, 이런 형식으로 있어야 되는 데, 없다.
rotate가 안되고 있다!!.
아래 명령어로 확인. -d 옵션이 debug 모드.
/usr/sbin/logrotate -d /etc/logrotate.conf
출력 내용중 아래와 같이 이상점 발견
considering log /var/log/messages
log needs rotating
로테이트가 필요없다고!? 2G에 육박하고 있는 데 무슨 소리야.
logrotate는 /var/lib/logrotate.status 파일의 내용을 참조하여 rotate를 한다.
해당 파일을 살펴보니 내용이 없다.
#비정상(문제서버)
[root@localhost log]# cat /var/lib/logrotate.status
logrotate state -- version 2
#정상(비교대상 서버)
[root@localhost log]# cat /var/lib/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2016-1-1
"/var/log/cups/error_log" 2016-10-9
"/var/named/data/named.run" 2016-11-20
"/var/log/sssd/*.log" 2015-1-6
"/var/log/dracut.log" 2016-1-1
"/var/log/wtmp" 2015-1-6
"/var/log/spooler" 2016-11-20
"/var/log/btmp" 2016-11-1
"/var/log/xferlog" 2016-11-20
"/var/log/maillog" 2016-11-20
"/var/log/cups/*_log" 2015-1-6
"/var/log/secure" 2016-11-20
"/var/log/messages" 2016-11-20
"/var/account/pacct" 2015-1-6
"/var/log/cron" 2016-11-20
"/var/log/vsftpd.log" 2015-1-7
열심히 검색 했으나, 원인은 찾을 수가 없다.
해결법은 아래 명령어로 rotate를 강제 적용 하는 것이다.
/usr/sbin/logrotate -f /etc/logrotate.conf
위와 같이 하면 /var/lib/logrotate.status 내용이 정상 서버와 같이 만들어지고,
아래와 같이 로테이트 된다. 기존 파일을 분할하는 건 아니다.
-rw------- 1 root root 148 2016-11-25 09:58 messages
-rw-------. 1 root root 1915641841 2016-11-25 09:58 messages-20161125
2016년 11월 16일 수요일
PPS cfgmaker
mrtg로 pps 를 체크하는 것에 대해서 글을 썼는데,
cfgmaker로 만들고 그걸 다시 수정하는 게 번거로웠다.
cfgmaker는 perl 로 작성되어 있어서 수정이 가능하다.
그래서 target 관련 부분만 수정해서 ppscfgmaker를 만들었다.
diff로 비교해 보면 알지만 한개 라인만 수정하였다.
ppscfgmaker
확장자가 없으면 업로드가 안되서 .txt를 추가했다.
.txt 부분만 지우고 사용하면 된다.
cfgmaker로 만들고 그걸 다시 수정하는 게 번거로웠다.
cfgmaker는 perl 로 작성되어 있어서 수정이 가능하다.
그래서 target 관련 부분만 수정해서 ppscfgmaker를 만들었다.
diff로 비교해 보면 알지만 한개 라인만 수정하였다.
[root@localhost bin]# diff cfgmaker ppscfgmaker
730c730
< my $default_target_directive = "Target[$target_name]: $if_ref:$router_connect";
---
> my $default_target_directive = "Target[$target_name]: ifInUcastPkts.$if_ref&ifOutUcastPkts.$if_ref:$router_connect + ifInNUcastPkts.$if_ref&ifOutNUcastPkts.$if_ref:$router_connect";
ppscfgmaker
확장자가 없으면 업로드가 안되서 .txt를 추가했다.
.txt 부분만 지우고 사용하면 된다.
피드 구독하기:
글 (Atom)