2016년 12월 28일 수요일

fail2ban ip 영구 차단

엄청 간단하다.

/etc/fail2ban/jail.conf 중 bantime = -1(영구차단)로 설정

 

예전에는 아마도 fail2ban 재시작시 banip가 없어지게끔 되어 있었나보다.

현재는 (Fail2ban v0.9.5) sqlite에 DB로 저장 되어 있기 때문에 다른 설정이 필요치 않다.

다만 재시작 시 로딩이 조금 느리다..




sqlite 파일 위치
[root@df log]# fail2ban-client get dbfile
Current database file is:
`- /var/lib/fail2ban/fail2ban.sqlite3

table 확인
[root@df log]# sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 .table
bans fail2banDb jails logs

차단된 명령어는 bans란 테이블에 들어가 있다. 그중에 ip값만 가져오면 차단된 ip 목록을 확인 가능하다.
중복된 것도 있기 때문에 distinct를 사용한다.
[root@df log]# sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select distinct ip from bans;"
1.206.220.154
1.31.67.224
1.34.190.13
101.25.28.112
103.243.107.193
103.243.54.168
104.43.161.37
...

ps.
테스트 서버에 findtime = 60, maxretry = 3 으로 설정 하고 ssh 포트를 기본포트(22)로 변경 하고 났더니, 하루에 100개이상의 공격이 들어온다... ㅎㄷㄷ;

2016년 12월 21일 수요일

다버튼 마우스 구매시 주의사항

레이저 나가 같은 마우스는 정말 사용하기 쉽지 않은 다버튼 마우스이다.



 

엄지 손사락을 아주 살포시 잡아야 하기 때문이다.

지금 마우스를 쓰고 있다면 엄지를 잡지 않고 마우스를 써봐라.

그러면 나가 같은 다버튼 마우스가 얼마나 똥망인줄 알게 될 거다.

 

최종적으로 구입한건 nyth 마우스 커스텀으로 버튼을 넣을 수 있어서

엄지를 넣을 수 있게, 6,7,10,11번 버튼을 빼고 사용중이다.

크게 마음에 들지는 않지만...

아무튼...

 
다버튼 마우스를 고를 때, 엄지 손가락 부분에 버튼을 가져다 넣은 것들은 전부 제끼자.

2016년 12월 15일 목요일

mysql(mariadb) 테이블별 mysqldump 백업

디비별 디렉토리를 만들고, 테이블별 .sql 파일을 만든다.
[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월 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포트는 열렸을 것이다.
telnet SERVER_IP 80

해당 서버에 연결이 되었다.
그리고 다시 arp 테이블 확인하면 역시 등록이 되었다.

스위치 포트별 서버의 IP를 체크하기 위해 직접 랜선을 일일이 비교하는 작업은 안해도 된다.

2016년 12월 8일 목요일

이벤트 실패 로그에 있는 공격 IP 뽑아내기.

이벤트 로그에 지속적인 공격이 들어오는 게 보인다. ㅅㅂㄹㄷ

이벤트 로그를 한개 한개 뒤져서 체크 하기가 힘들다.

예전에 작성했던 자동 차단 파워쉘을 조금 수정해서 목록만 뽑도록 만듬.

원격데스크탑(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 심볼릭 링크가 만들어져있다.
[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 서버중 한대에서 디스크 에러가 났다.
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