OS/Linux에 대한 글이 23 개 검색되었습니다.
2017/07/27 13:47
제가 관리하는 서버들 앞단에 방화벽이 없는 관계로 IPTABLES와 tcpwapper를 이용한 제어를 하고 있습니다.
다만, 중국과 같은 나라에서 엄청나게 brute-force 공격을 감행하는지라, 한국이외에 접속을 차단하고 싶었습니다.

저의 경우 한국만 들어오게 하고 나머지 나라에선 들어올 이유가 없으므로, geoiplookup을 이용하여 ssh 내에 시도할 때에 한국만 들어올 수 있도록 하였습니다.

1. GeoIP Database 설치

제일 먼저 진행 되어야 할 부분은 GeoIP Database를 설치하여야 합니다.

# yum install geoip


/usr/bin/geoiplookup 이 존재하는지 확인하여야 합니다.

# geoiplookup 8.8.8.8 
GeoIP Country Edition: US, United States
GeoIP City Edition, Rev 1: US, CA, California, Mountain View, 94035, 37.386002, -122.083801, 807, 650
GeoIP ASNum Edition: AS15169 Google Inc.


위와 같이 확인이 되었다면 정상적으로 GeoIP가 설치된 것입니다.

2. Script 작성

# vi /usr/local/bin/sshfilter.sh
#!/bin/bash
# 대문자로 공백으로 국가코드를 입력하면 해당국가만 허용됩니다. ex) KR FR CN
ALLOW_COUNTRIES="KR"
if [ $# -ne 1 ]; then
echo "Usage: `basename $0` <ip>" 1>&2
exit 0 # return true in case of config issue
fi
COUNTRY=`/usr/bin/geoiplookup $1 | awk -F ": " '{ print $2 }' | awk -F "," '{ print $1 }' | head -n 1`
[[ $COUNTRY = "IP Address not found" || $ALLOW_COUNTRIES =~ $COUNTRY ]] && RESPONSE="ALLOW" || RESPONSE="DENY"
if [ $RESPONSE = "ALLOW" ]
then
# 이상 없을 경우 바로 통과
exit 0
else
# 차단되었을 경우 기록 남김
logger "$RESPONSE sshd connection from $1 ($COUNTRY)"
exit 1
fi


이후 chmod 755 /usr/local/bin/sshfilter.sh 퍼미션을 수정하여 줍니다.

3. TCPWAPPER 설정

/etc/hosts.deny와 /etc/hosts.allow를 수정하여 세팅하여야 합니다.

# vi /etc/hosts.deny
# ssh 접근을 모든곳에서 차단합니다.
sshd: ALL

# vi /etc/hosts.allow
sshd: ALL: spawn /usr/local/bin/sshfilter.sh %a


위와 같이 설정하게 될 경우 ssh로 접속하는 모든 사람들에게 /usr/local/bin/sshfilter.sh <ip>가 수행됩니다.
실제 테스트는 아래와 같이 하며, 확인은 /var/log/messages 로그에서 확인 하실 수 있습니다.

# /usr/local/bin/sshfilter.sh 61.177.172.60
tail -f /var/log/messages 확인시 아래와 같은 항목 검출

DENY sshd connection from 61.177.172.60 (CN)


위와 같이 정상적으로 연결이 되었다면 sshfilter.sh 내에 허용한 국가에서만 접속을 할 수 있습니다.
따라서, 중국에서 들어오는 공격은 tcpwapper에 의하여 차단되는 원리입니다.


2017/07/27 13:47 2017/07/27 13:47
2017/04/20 10:00

파일당 최대 크기 제한하기

Posted by JParker
OS/Linux 2017/04/20 10:00
 안녕하세요? 얼마전 저에게 문의온 내용중 한가지가 아래와 같습니다.

" 사용자 계정 내에 파일 크기가 많이 생성되어 난감합니다...."

아래와 같은 방법을 이용하시면 각 사용자별 파일당 최대 크기를 제한 하실 수 있습니다.  


[root@web ~]# vi /etc/security/limits.conf
#<domain> <type> <item> <value>
#<domain> can be:

# - a user name
# - a group name, with @group syntax
# - the wildcard *, for default entry
# - the wildcard %, can be also used with %group syntax,
# for maxlogin limit
#
#<type> can have the two values:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
#
#<item> can be one of the following:
# - fsize - maximum filesize (KB)

# Fsize는 KB단위로 아래와 같이 설정을 하시게 되면 자동으로 적용 될 수 있습니다.
userid - fsize 1024000

[userid@web ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) 1024000
pending signals (-i) 11387
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

# TEST

[userid@web ~]$ dd if=/dev/zero of=bigfile bs=1024 count=3145728
File size limit exceeded


위와 같이 하시게 될 경우 파일당 최대 1기가 이상을 넘지 못하도록 제안을 걸어두실 수 있습니다.
2017/04/20 10:00 2017/04/20 10:00
2017/04/17 12:28

SNMPD LOG 안남게 하기

Posted by JParker
OS/Linux 2017/04/17 12:28
# 서버에 snmpd 데몬이 실행되는 동안에는 /var/log/messages 에 다음과 같은 메시지가 쌓입니다.
Apr 17 12:10:03 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:42223->[xxx.xxx.xxx.xxx]
Apr 17 12:15:01 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:48494->[xxx.xxx.xxx.xxx]
Apr 17 12:15:03 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:39339->[xxx.xxx.xxx.xxx]
Apr 17 12:20:02 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:47832->[xxx.xxx.xxx.xxx]
Apr 17 12:20:03 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:47496->[xxx.xxx.xxx.xxx]
Apr 17 12:25:02 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:44137->[xxx.xxx.xxx.xxx]
Apr 17 12:25:03 web snmpd[1355]: Connection from UDP: [xxx.xxx.xxx.xxx]:40542->[xxx.xxx.xxx.xxx]


snmpd 데몬을 오랫동안 사용하는 중이라면, 위와 같은 메시지가 messages log 의 상당수를 차지하게 됩니다.
이부분은 추후에 messages log 를 확인하는데 상당히 불편한 경우가 발생 할 수 있습니다.
정상적으로 snmpd 동작한다면 messages log 에 snmpd log 를 남기지 않도록 합니다.

/etc/init.d/snmpd 데몬파일 수정하기
# OPTIONS="-LS0-6d -Lf /dev/null -p /var/run/snmpd.pid" 
OPTIONS="-LS 2 d -Lf /dev/null -p /var/run/snmpd.pid -a"


위의 내용에서 # 부분으로 주석처리 하고 아래의 줄로 대체하고 저장합니다.

마지막으로 /etc/init.d/snmpd restart 후 확인을 하면 되겠지요?
[root@web log]# ps -ef | grep snmpd | grep -v grep
root      2619     1  0 12:27 ?        00:00:00 /usr/sbin/snmpd -LS 2 d -Lf /dev/null -p /var/run/snmpd.pid -a
[root@web log]# 
2017/04/17 12:28 2017/04/17 12:28
2017/03/28 15:19

iptables로 국가별 차단하기.

Posted by JParker
OS/Linux 2017/03/28 15:19
오랜만에 글을 쓰게 되네요... 

이전엔 커널과 iptables를 소스컴파일하여 사용하여 국가별 차단을 하였습니다.
하지만, 세월이 흐르고 많이 변했죠? Redhat계열에서는 RPM을 많이 사용하시므로 
rpm과 한가지 소스 컴파일만 가지고 국가별 차단할 수 있는 모듈을 만들어 보도록하겠습니다.

1. 관련 자료 다운받기
본 자료는 oops.org에서 가져온 데이터이며, 설치에 대한 부분은 생략 하도록 하겠습니다.
GeoIP는 기존 free 버전을 사용하셔도 무방합니다. 

RPM 소스 



제가 만들어놓은 CentOS 6.8 기준입니다.




xtables-addons-1.47.1.tgz 의 경우 ipv6관련으로 링크가 깨지는 문제로 수정해서 다시 패키징 해놓은 상태입니다.

2. 패키지 설치

2-1. yum 을 이용하여 kernel-debug-devel , iptables-devel  두가지를 설치 합니다.
2-2. 본 사이트에서 제공하는 GeoIP 패키지 (srpm제외)를 설치합니다.
2-3. xtables 애드온을 설치합니다.

# tar xvfz xtables-addons-1.47.1.tgz 
# cd xtables-addons-1.47.1
# ./configure; make; make install
# cd geoip
# cp xt_geoip* /usr/sbin/

위와 같이 하게 되면 설치가 완료되며, 해당 패키지들은 설정이 완료됩니다.2-4. 설정해당 모듈은 /usr/share/xt_geoip 내에 설정 됩니다. 초반에는 해당 디렉토리가 없으므로 디렉토리 생성을 합니다.

 # mkdir /usr/share/xt_geoip ;  cd /usr/share/xt_geoip 

위와 같이 진행하게 되면, 이제 IP대역을 다운 받아와야 합니다.

# /usr/sbin/xt_geoip_dl 
http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz
Resolving geolite.maxmind.com... 104.16.38.47, 104.16.37.47, 2400:cb00:2048:1::6810:252f,
Connecting to geolite.maxmind.com|104.16.38.47|:80... connected.
>HTTP request sent, awaiting response... 200 OK
Length: 1402286 (1.3M) [application/octet-stream]
Saving to: “GeoIPv6.csv.gz” 100%[===================================>] 1,402,286
(28.3 MB/s) - “GeoIPv6.csv.gz” saved [1402286/1402286]
http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Reusing existing connection to geolite.maxmind.com:80.
HTTP request sent, awaiting response... 200 OK Length: 2163552 (2.1M) [application/zip]
Saving to: “GeoIPCountryCSV.zip” 100%[===================================>] 2,163,552
(54.1 MB/s) - “GeoIPCountryCSV.zip” saved [2163552/2163552]

# ls -l
-rw-r--r-- 1 root root 2163552 Mar 8 06:20 GeoIPCountryCSV.zip
-rw-r--r-- 1 root root 10814456 Mar 8 06:18 GeoIPCountryWhois.csv
-rw-r--r-- 1 root root 5100890 Mar 8 06:19 GeoIPv6.csv

세가지의 디렉토리가 보일 것입니다. GeoIPCountryCSV.zip의 경우  GeoIPCountryWhois.csv를 압축하여 놓은 것이므로, 두가지만 입력하도록 합니다. 아까 복사해두었던 명령어중 한가지인 xt_geoip_build 명령을 이용합니다.

# /usr/sbin/xt_geoip_build GeoIPCountryWhois.csv
144432 entries total
0 IPv6 ranges for A1 Anonymous Proxy
32 IPv4 ranges for A1 Anonymous Proxy
.
. 많은 데이터가 있으므로 중략...
.
0 IPv6 ranges for ZM Zambia
66 IPv4 ranges for ZM Zambia
0 IPv6 ranges for ZW Zimbabwe
63 IPv4 ranges for ZW Zimbabwe

해당 데이터가 업로드되었습니다. 만일 perl error가 발생되시는 분들이 있다면 epel에서 패키지를 추가로 설치하셔야 합니다.

# yum install  perl-Text-CSV_XS --enablerepo=epel

위와 같이 정상적으로 설치가 된 경우 아래와 같이 iptables 명령어를 추가하여 사용하실 수 있습니다.

# iptables -A INPUT -m geoip --src-cc CN -j DROP 
# iptables -vL | grep DROP 354 19850 DROP
all -- any any anywhere anywhere Source country: CN

위와 같이 나오게 될 경우 정상적으로 중국 국가별로 차단하는 것입니다.
2017/03/28 15:19 2017/03/28 15:19
2017/03/17 14:22

CentOS6에서 SSH 접속시도 차단하기

Posted by JParker
OS/Linux 2017/03/17 14:22
CentOS6에서 SSH 접근 시도 차단하기

기본 구성인 SSH 데몬은 무차별 공격(Blueforce Attack)에 취약할 수 있습니다. 이를 방어하기 위하여 iptables를 이용한 opensource가 있습니다. 바로 fail2ban 이라는 Application입니다. 이 프로그램은 /var/log/secure 로그 파일을 읽어 로그인 시도 실패에 대한 횟수를 지정한 수로 읽어 iptables로 차단을 하게 됩니다. 기본적으로 제공되는 프로그램이 아니기 떄문에 epel 패키지에서 가져와야 합니다.

1. Fail2Ban 설치
# rpm -Uhh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install -y fail2ban --enablerepo=epel
Loaded plugins: auto-update-debuginfo, fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
* base: ftp.daumkakao.com
* epel: mirror.premi.st
* epel-debuginfo: mirror.premi.st
* extras: ftp.daumkakao.com
* updates: ftp.daumkakao.com
Resolving Dependencies
--> Running transaction check
---> Package fail2ban.noarch 0:0.9.4-2.el6 will be updated
---> Package fail2ban.noarch 0:0.9.6-1.el6.1 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================
Package Arch Version Repository Size
==========================================================
Updating:
fail2ban noarch 0.9.6-1.el6.1 epel 468 k

Transaction Summary
==========================================================
Upgrade 1 Package(s)

Total download size: 468 k
Downloading Packages:

fail2ban-0.9.6-1.el6.1.noarch.rpm | 468 kB 00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : fail2ban-0.9.6-1.el6.1.noarch 1/2
Cleanup : fail2ban-0.9.4-2.el6.noarch 2/2
Verifying : fail2ban-0.9.6-1.el6.1.noarch 1/2
Verifying : fail2ban-0.9.4-2.el6.noarch 2/2

Updated:
fail2ban.noarch 0:0.9.6-1.el6.1
Complete!
2. 구성 파일 복사
기본 fail2ban 구성파일은 /etc/fail2ban/jail.conf로 되어있습니다. 기본으로 기동하게 되면 에러를 발생하게 합니다.
따라서, 적용할 수 있도록 다음과 같이 변경하셔야 합니다.
[root@www ~]# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
위와 같이 복사가 완료한 후 설정 파일을 열게 되면 보호할 수 있는 여러가지 방법이 존재합니다.
3. jail.local의 기본값 설정
[root@www ~]# vim /etc/fail2ban/jail.local
첫번째 섹션은 fail2ban이 따르는 기본 규칙을 다룹니다. 가상 서버에 더 세세히 변경하려면 각 섹션의 세부사항을 정의 할 수 도 있습니다.
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space (and/or comma) separator.
# 제외할 아이피를 설정합니다.
ignoreip = 127.0.0.1/8
# "bantime"은 호스트에 접근을 제안하는 시간(초 단위)입니다.
bantime = 3600
# "findtime" 시간 동안 "maxretry"를 초과할 경우 대상이 되도록 합니다. (초 단위)
findtime = 600
# "maxretry"는 /var/log/secure내에 fail 횟수에 대한 제안 설정입니다
# 아래는 3회 이상일 경우 bantime동안 차단됩니다.
maxretry = 3
ignoreip줄에 개인서버 IP를 입력하시기 바랍니다. 또한, 각 주소는 공백으로 구분할 수 있습니다. 접근하시는 IP를 넣을 경우 이 서버에서 실수로 접근하는 분을 차단하지 않을 것입니다.
bantime은 호스트에 접근 제한 시간입니다. 기본 단위는 초이며, 해당 시간 이후 자동으로 해제 됩니다.
maxretry는 접근 실패시 몇번이후 차단할 수 있도록 하는 것이며, 횟수로 설정합니다. (기본 6회)
findtime은 호스트가 로그인 시도후 600초 이내에 maxretry값 이상 실패하면, 해당 IP를 bantime동안 차단합니다.
4. jail.local에 ssh-iptables 섹션 구성
ssh 세부 정보 섹션은 구성에서 아래 있습니다. 하지만 이 섹션에는 따로 세부정보를 설정할 수가 없습니다. 예를 들면, fail시 담당 email을 발송 할 수 있도록 하는 기능도 포함되어있습니다.
[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=root, sender=jaehun@me.com]
logpath = /var/log/secure
maxretry = 5
enabled는 해당 섹션의 동작유무를 나타냅니다. 기동은 true 중지는 fail로 설정할 수 있습니다. 기본적으로 sshd 설정에 fail2banuses가 일치하는 구성 파일이 있습니다. /etc/fail2ban/filter.d/sshd.conf  내에 기본 설정이 되어있습니다.
Action은 fail2ban이 일치하는 IP주소를 차단하기 위해 행할 단계입니다. failter 항목과 마찬가지로 각 작업은 action.d 디렉토리 내에 파일을 참조합니다. 기본 금지 조치인 IPTABLES는 /etc/fail2ban/action.d/iptables.conf 내에 존재합니다. iptables 세부사항에서 fail2ban을 추가로 사용자 정의가 가능합니다. 예를 들어 비표준 포트를 사용하는 경우 대괄호 내에 포트 번호와 일치하도록 변경하여 다음과 같이 표시 할 수 있습니다.
ex: iptables [name = SSH, port = 30000, protocol = tcp]
fail2ban에서 모니터링하는 프로토콜은 tcp에서 udp까지 변경이 가능합니다. 해당 엑션이 동작되면 fail2ban이 이메일을 발송할 수 있습니다. 해당 명령인 sendmail-whois는 /etc/fail2ban/action.d/sendmail-whois.conf 에 기본 설정이 되어있으므로 참조하시기 바랍니다. logpath는 secure 파일의 위치를 나타냅니다.

5. fail2ban 기동하기
fail2ban의 설정값을 변경하면 항상 fail2ban을 재시작하여 주시기 바랍니다.
/etc/init.d/fail2ban restart 또는 service fail2ban restart
항상 root로 기동하셔야 합니다. 만일 fail2ban이 iptables내에 적용되어있는지를 확인하고 싶다면 아래와 같이 확인할 수 있습니다.
iptables -L
요즘들어 SSH로 접근시도하는 중국발 blueforce공격이 심해지고 있습니다. 어이없는 패스워드 설정으로 공격자에게 root를 주는 황당한 일을 당하지 맙시다~
2017/03/17 14:22 2017/03/17 14:22
2017/03/16 08:58

SSH 사용자 접근제어

Posted by JParker
OS/Linux 2017/03/16 08:58

SSH 접근 제어 방법
접속을 허가한 계정만 ssh를 통해서 접속이 가능하게 설정해보자.
[테스트 시나리오]
서버에는 tommy, john, root 계정이 존재 한다. root와 john는 ssh로 접속이 가능하게 하고, tommy로는 접속이 되지 않도록 하고 싶다.

[설정]
이 방법은 pam 인증을 이용한 방법이므로 /etc/pam.d/sshd 에 다음과 같은 라인을 추가시켜 준다. /etc/pam.d/sshd 제일 상위 줄에에 추가시켜 준다.

#%PAM-1.0 
auth required /lib/security/pam_listfile.so item=user sense=allow file=/etc/sshd_acl onerr=succeed


각 간격은 tab 으로 띄어준다.
위와 같이 추가한 뒤에는 /etc/sshd_acl 파일을 생성한뒤에 다음과 같이 추가한다.

 #vi /etc/sshd_acl
root
john


자! 그럼 모두 완료 되었다.

[실행테스트]
 -> sshd_acl에 등록된 사용자 [root@john john]# ssh -l john 192.168.0.2  john@192.168.0.2's password: 
Last login: Tue Dec 14 15:31:36 2016 from john

-> sshd_acl에 등록이 되지 않은 사용자
[root@john john]# ssh -l tommy 192.168.0.2
tommy@192.168.0.2's password:
Permission denied, please try again.

-> sshd_acl에 등록한 사용자 (tommy 를 acl등록후 연결 성공)
[root@john john]# ssh -l tommy 192.168.0.2
tommy@192.168.0.2's password:
Last login: Tue Dec 14 15:31:36 2016 from john

이 방법을 사용하여, 서버에 계정을 가지고 있으면 누구나 서버에 접속할 수 있는것이 아니라,
root가 허가를 해준 사용자만이 접속 가능하도록 설정할수 있다.

2017/03/16 08:58 2017/03/16 08:58
Tags , ,
2017/02/28 17:57

multipath 기본 설정 방법

Posted by JParker
OS/Linux 2017/02/28 17:57
SAN Storage에서 LUN을 던저주었을 경우 아래와 같이 설정한답니다.

mpathconf --enable 이후 /etc/multipath.conf 파일 내에 수정을 하고 재부팅 하면
기본적으로 설정 방식대로 올라오는 것이지요~

blacklist_exceptions {
# multipath 사용할 wwid들만 입력
wwid ...
}

blacklist {
# 아래와 같이 넣는 이유는 usb 또는 디스크 추가시
# multipath 내에 join 되지 않도록 하기 위함입니다
wwid *
}

# multipath 사용할 볼륨 고정
multipaths {
multipath {
wwid 360a.........
alias data001
}
multipath {
wwid 360b.......
alias data002
}
}

이렇게 하면 보통 큰문제없이 설치가 됩니다. 간혹 클러스터 구성에 quorum이 들어갈 경우 아래와 같이 넣어주셔야 합니다

defaults {
user_friendly_....
# 아래부분 추가 (quorum 사용시 또는 cluster 사용시)
no_path_retry fail
flush_on_last_del yes
}


[##_1C|2226670473.pdf||_##]
2017/02/28 17:57 2017/02/28 17:57
Tags , ,
2017/02/27 13:04
Red Hat 제품 보안팀은 Linux 커널의 DCCP 프로토콜 IPV6 구현에 따른 영향에 대한 보안 취약점을 인지하고 있으며 이는 CVE-2017-6074로 지정되어 있습니다. 본 취약점은 2017년 2월 20일에 공지되었으며 중요한 영향을 미치는 것으로 평가되고 있습니다.

배경정보
DCCP는 프로그래머가 응용 프로그램 계층에서 네트워크 정체 설정을 제어할 수 있도록 고안된 4 계층 (전송 계층) 프로토콜입니다. 이 프로토콜은 3 계층 (네트워크 계층) 프로토콜로 IP를 사용하므로 인터넷을 통해 라우팅할 수 있습니다. 이로 인해 이러한 프로토콜은 IPV4 및 IPV6 기반 시스템 모두에서 작동하도록 고안되었습니다. 본 취약점은 IPV6 기반 DCCP 연결을 명시적으로 사용하여 악용됩니다. DCCP는 내부의 상태 머신을 사용하여 연결을 추적합니다. 이러한 경우 소켓이 LISTEN 상태에 있는 동안 DCCP 상태 머신은 DCCP_PKT_REQUEST 데이터 구조를 잘못 처리합니다. 이를 통해 네트워크에 연결된 동일한 노드에서 클라이언트와 서버 모두를 제어할 수 있는 로컬 사용자는 "Use After Free" (메모리 해제 후 사용) 상태가 주어질 수 있습니다. 연결이 완료되면 연결 당 skbuff라는 데이터 구조체가 만들어지게 됩니다. 마지막 skbuff에 다른 구조체에 있는 skb_shared_info를 호출하게 되며 여기에는 ubuf_info 구조체가 포함됩니다. 이 구조체에는 skb가 삭제될 때 호출할 함수 포인터가 포함되어 있습니다. skbuff 메모리 해제 이후 이러한 ubuf_info 구조체의 콜백 함수를 호출하게 되면서 오류 상태가 발생합니다. 이를 통해 공격자는 악의적인 명령으로 메모리를 덮어쓰기할 수 있는 상황을 만들 수 있으며 메모리 해제와 이차적인 악의적인 명령 사이에서 함수 포인터 값을 악용할 수 있습니다.

대응방법
영향을 받는 커널 버전을 실행하고 있는 모든 Red Hat 고객의 경우 패치 릴리즈 후 커널을 업데이트할 것을 권장합니다. 영향을 받는 패키지와 권장 완화 방법은 아래에 설명되어 있습니다. 커널 업데이트를 적용하려면 시스템을 다시 시작해야 합니다.
이 공격에는 sk_shared_info 구조체에 대한 메모리가 해제된 후 사용될 수 있도록 동일한 시스템에서 실행되고 있는 서버와 클라이언트가 필요합니다. 

Red Hat 제품 보안팀은 본 취약점이 이번 업데이트에서 중요한 영향을 미치는 것으로 평가하고 있습니다.

영향을 받는 제품
영향을 받는 Red Hat 제품 버전은 다음과 같습니다:
- Red Hat Enterprise Linux 5
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 7
- Red Hat Enterprise MRG 2
- Red Hat Openshift Online v2
- Red Hat Virtualization (RHEV-H/RHV-H)
- RHEL Atomic Host

공격 내용 및 영향 
본 취약점을 통해 로컬 시스템 계정이 있는 공격자가 권한을 상승시킬 수 있는 가능성이 있습니다. 이러한 취약점은 일반적으로 UAF (Use After Free)라고 부르며 이전에 실행된 free() 작업으로 인해 사용 중인 할당을 더이상 참조하지 않는 포인터를 통해 메모리에 접근하는 코드 경로를 사용하여 악용됩니다. 본 취약점은 DCCP 네트워킹 코드에 존재하며 충분한 액세스 권한을 갖는 악의적인 공격자가 해당 코드에 액세스하여 모든 로컬 인터페이스의 DCCP 네트워크 연결을 설정할 수 있습니다. 악용에 성공하면 호스트 커널 크래시, 호스트 커널 컨텍스트에 있는 코드 실행 또는 커널 메모리 구조를 변경하여 다른 권한 상승을 유발할 수 있습니다. 공격자는 시스템의 로컬 계정에 액세스할 수 있어야 합니다. 이는 원격 공격이 아니며 IPV6 지원이 활성화되어 있어야 합니다.

체크 스크립트
대응 방법
영향을 받는 커널 버전을 실행하고 있는 모든 Red Hat 고객의 경우 패치 릴리즈 후 커널을 업데이트할 것을 권장합니다. 영향을 받는 패키지와 권장 완화 방법은 아래에 설명되어 있습니다. 커널 업데이트를 적용하려면 시스템을 다시 시작해야 합니다.

사용자 삽입 이미지
영향을 받는 제품 업데이트
* 이러한 패치에 액세스하려면 활성 EUS 서브스크립션이 필요합니다.
사용 계정에 활성 EUS 서브스크립션이 없을 경우 보다 자세한 내용은 Red Hat 영업팀 또는 해당 영업 담당자에게 문의하시기 바랍니다.

Red Hat Enterprise Linux Extended Update Support 서브스크립션이란?

**RHEL AUS에서 이러한 패치에 액세스하려면 활성 AUS 서브스크립션이 필요합니다. 
 

완화 방법
응용 프로그램이 DCCP 프로토콜을 사용하려할 때 DCCP 커널 모듈이 자동으로 로드됩니다. 이 모듈이 로드되지 않도록 하려면 시스템 전반의 modprobe 규칙을 사용합니다. 다음과 같은 명령 (root로 실행)을 통해 실수로 또는 의도적으로 모듈이 로드되지 않게 합니다. Red Hat 제품 보안팀은 이러한 방법이 권한이 있는 사용자라도 실수로 모듈을 로드할 수 없도록 하기 위한 강력한 방법이라고 생각합니다. [code]# echo "install dccp /bin/true" >> /etc/modprobe.d/disable-dccp.conf

DCCP 모듈이 이미 로드된 경우 시스템을 다시 시작해야 합니다. 대부분의 경우 DCCP 커널 모듈은 사용 중이거나 네트워크 인터페이스가 활성화 상태일 때 언로드할 수 없습니다. 추가 도움이 필요할 경우 KCS 기사 ( https://access.redhat.com/solutions/41278 )를 참조하거나 Red Hat 글로벌 지원 서비스에 문의하십시오. 또한 RHEL 6 및 7 시스템을 완전 업데이트하기 위한 기본 SELinux 정책은 CVE-2017-6074에 대한 bugzilla 상세 정보에 설명되어 있듯이 본 결함을 완화시킬 수 있습니다.
 
2017/02/27 13:04 2017/02/27 13:04
Tags , , ,
2017/02/27 13:00

Fast TSC calibration failed issue

Posted by JParker
OS/Linux 2017/02/27 13:00
RHEL7을 VM에서 구동하다 다음과 같이 에러가 발생됨을 확인하였습니다.
 
[ 0.000000] Fast TSC calibration failed.
 
위의 부분은 부팅시 발생되는 부분이며, TSC는 Time Stamp Counter의 약자이더군요.
해결방법은 다음과 같이 하시면 해결하실 수 있습니다.

/etc/default/grub 마지막줄에

GRUB_CMDLINE_LINUX="clocksource=tsc"
위의 항목을 넣어주시고 다음과 같은 명령을 수행하여 주시기 바랍니다.

[root@dev ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-b161999d89d0472890f8a83cc933a9fb
Found initrd image: /boot/initramfs-0-rescue-b161999d89d0472890f8a83cc933a9fb.img
done
[root@dev ~]#
위와 같이 출력되고 나신 뒤부터는 정상적인 부분을 보실 수 있습니다.
위의 에러는 3.x 커널에 vmware 4.x 버젼에서 발생된다고 합니다.

저와 같이 해결을 하시기 바랍니다. 파이팅~!!!
2017/02/27 13:00 2017/02/27 13:00
Tags , , ,
2017/02/27 12:57

chmod 777 * -R 명령을 /에서...

Posted by JParker
OS/Linux 2017/02/27 12:57
만일 아래의 명령을 실수로 내렸을 때에 복구 방법은?
chmod 777 * -R
오늘 작업중 유난히 특별 케이스를 보았습니다. 상당히 맨붕이 왔지만... yum 혹은 RPM에서 설치 하셨다면 다음과 같이 패키지에 들어있는 패키지의 퍼미션들을 뽑아서 복구 할 수 있습니다. 기본적인 퍼미션 복구 방법은 다음과 같습니다.
rpm --setperms packagename
위의 명령은 setperms로 packagename에 관련된 파일에 대하여 최초 설치시 퍼미션으로 되돌리는 것입니다. 전체의 퍼미션을 복구 하고 싶을 경우는 다음과 같이 하시면 됩니다.
rpm --setperms -a
이와 관련하여 소유권까지 변경되었다면... 다음 명령어로도 수행이 가능하니 참조하실 수 있겠죠?
rpm --setugids packagename
위의 퍼미션 처럼 동일하게 패키지 최초 설치시 소유권으로 되돌려줍니다. 퍼미션과 소유권을 전체 설정하고 싶으시다면 다음과 같이 하실 수 있습니다.
rpm --setugids --setperms -a
위와 같이 하면 시스템에 설치되었던 패키지 RPM 리스트수대로 chown및 chgrp 그리고 chmod 명령을 수행하여 해당 시스템에 퍼미션들을 수정하게 될 것입니다.
2017/02/27 12:57 2017/02/27 12:57
Tags , ,
2017/02/27 12:56

조건문에 들어가는 비교식

Posted by JParker
OS/Linux 2017/02/27 12:56
많은 곳에 쓰이는 조건식에 대하여 아래와 같이 나열해봅니다. 조건식의 문자열 비교

조건식

설명

문자열1 == 문자열2 문자열이 일치
문자열1 != 문자열2 문자열이 일치하지 않음
-z 문자열 빈 문자열
-n 문자열 빈 문자열이 아님
문자열 == 패턴 문자열이 패턴에 매치
문자열 != 패턴 문자열이 패턴에 매치하지 않음
조건식의 수치 비교

조건식

설명

수치1 -eq 수치2 수치가 같음
수치1 -ne 수치2 수치가 같지 않음
수치1 -lt 수치2 수치1이 수치2보다 작음
수치1 -le 수치2 수치1이 수치2보다 작거나 같음
수치1 -gt 수치2 수치1일 수치2보다 큼
수치1 -ge 수치2 수치1이 수치2보다 크거나 같음
조건식에 따른 파일검사

조건식

설명

-e 파일명 파일이 존재함
-d 파일명 디렉토리
-h 파일명 심볼릭링크
-f 파일명 일반 파일
조건식에 따른 조건 논리연산

조건식

설명

조건1 && 조건2 양쪽다 성립
조건1 || 조건2 한쪽 혹은 양쪽 다 성립
!조건 조건이 성립하지 않음
true 조건이 언제나 성립
false 조건이 언제나 성립하지 않음
2017/02/27 12:56 2017/02/27 12:56
2017/02/27 12:54

POODLE sslv3 패치관련

Posted by JParker
OS/Linux 2017/02/27 12:54
OPENSSL POODLE  sslv3 패치가 또 나왔습니다. 얼마전 있었던 heart bleed와 쉘 버그에 이어 푸들 쇼크가 한바탕 몰아쳤습니다. SSL3를 아예 꺼두고 하위 호환성을 위해 TLS_FALLBACK_SCSV 를 사용하라는 가이드 라인이 있습니다. 업계에서는 SSL을 더이상 사용하지 않는 방향으로 가는 듯 합니다.

푸들 관련 기사 및 정보
http://security.stackexchange.com/questions/70719/ssl3-poodle-vulnerability https://blog.mozilla.org/security/2014/10/14/the-poodle-attack-and-the-end-of-ssl-3-0/
(국내 기사)
http://www.zdnet.co.kr/news/news_view.asp?artice_id=20141015090101 http://news.imaso.co.kr/134361

추가로 OpenSSL을 사용하시는 분들은 푸들 보다 (더 심각한) DOS 공격 관련 취약성이 있으니 패치를 권고한다는 문서도 있습니다. 공격으로 인한 메모리 릭이 발생할 수 있는 버그는 2건 입니다.

OpenSSL 패치 보고서.
POODLE 및 메모리 누수  :  http://www.theregister.co.uk/2014/10/15/openssl_ddos_vulns/

지난 수요일 https://www.openssl.org/  에 푸들과 DOS 공격을 위한 네 가지 패치가 올라와 있습니다.
2017/02/27 12:54 2017/02/27 12:54
Tags , ,
2017/02/27 12:54

NTP 서버 환경 구축하기

Posted by JParker
OS/Linux 2017/02/27 12:54
NTP 서버 환경 구축하기

NTP는 Network Time Protocal 의 줄임말로 네트워크로 연결되어 있는 컴퓨터들끼리 시각을 동기화시키는데 사용되는 프로토콜입니다. 서버데몬 실행시 Port는 UDP 23번을 사용합니다.  방화벽에 막혀있으면 서비스가 불가능하겠죠?

NTP서버및클라이언트 개념은 /etc/conf파일을 수정하기 나름입니다. 해당구축 플랫폼의 서버 3대의 시간을 동기화시키기 위해
1번 서버에 NTP설정을 하고 2번,3번 서버가 1번으로 바라보도록 NTP설정을 해주면 됩니다.

결국에 같은설정될 수도 아닐수도 있겠죠 그리고 굳이 동기화 시키지 않고 한번만 혹은 때때로 하실경우엔 ntpdate [ServerIP]를 사용하시면 됩니다. 그러나 이 경우는 rdate와 별반차이가 없기에 윗부분만 설명드리도록 하겠습니다.

1.NTP 설치
root# yum -y install ntp

2. NTP구성
(굵게 표시한부분만 따라오세요)
root# vi /etc/ntp.conf
# Permit time synchronization with our time source, but do not
# permit the source to query or modify the service on this system.
restrict default kod nomodify notrap nopeer noquery
# Permit all access over the loopback interface. This could
# be tightened as well, but to do so would effect some of
# the administrative functions.
restrict 127.0.0.1
restrict -6 ::1
# Hosts on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#broadcast 192.168.1.255 key 42 # broadcast server
#broadcastclient # broadcast client
broadcast 224.0.1.1 key 42 # multicast server
#multicastclient 224.0.1.1 # multicast client
#manycastserver 239.255.254.254 # manycast server
#manycastclient 239.255.254.254 key 42 # manycast client
#NTP Server List (Start)
server time.bora.net iburst
server time.nuri.net iburst
server ntp1.gngidc.net iburst
server ntp2.gngidc.net ibust
##NTP Server List (END)
# Undisciplined Local Clock. This is a fake driver intended for backup
# and when no outside source of synchronized time is available.
server 127.127.1.0
fudge 127.127.1.0 stratum 10
# Drift file. Put this in a directory which the daemon can write to.
# No symbolic links allowed, either, since the daemon updates the file
# by creating a temporary in the same directory and then rename()'ing
# it to the file.
driftfile /var/lib/ntp/drift
# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys
# Specify the key identifiers which are trusted.
#trustedkey 4 8 42
# Specify the key identifier to use with the ntpdc utility.
#requestkey 8
# Specify the key identifier to use with the ntpq utility.
#controlkey 8
restrict None mask 255.255.255.255 nomodify notrap noquery
:wq (vi 나오기)

3. NTP 데몬 가동
root# service ntpd start

4. 클라이언트의 경우
방법1. 무조건 되는 방법 굵게 표시된 server를  다 삭제하시고 server 10.1.1.1로 변경하는 방법이 있습니다.
방법2. 같은 네트워크 대역시 추천드립니다. (Boardcast, Multicast, Manycast 셋중택일)
root# cat /dev/null > /etc/ntp.conf
root# cat >> /etc/ntp.conf << EOF
server 10.1.1.1
multicastclient 224.0.1.1
EOF

*확인방법 3가지(Process, Netstat, ntpq)
1. Process 확인
 root# ps -ef| grep ntp 
ntp 27421 1 0 13:02 ? 00:00:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid
2. netstat 확인

root# netstat -anp | grep ntp
udp 0 0 10.1.1.1:123 0.0.0.0:* 27421/ntpd
3. net 상태확인 (루트만가능 : 구동 이후 2~3분 경과시 출력됨.)
root # netq -p 
remote refid st t when poll reach delay offset jitter
=================================================================
10.1.1.1 211.115.194.21 3 u 11 64 3 0.311 37.229 8.749
2017/02/27 12:54 2017/02/27 12:54
Tags , ,
2017/02/27 12:52

리눅스 설치시 파티션 구성

Posted by JParker
OS/Linux 2017/02/27 12:52
리눅스를 처음 설치시 많이 당혹스럽다는 부분이 파티션 구성입니다. 허나 리눅스 구성시 다음과 같이 설정하시면 큰 무리 없이 설치가 가능하십니다. 리눅스 기본 설치 파티션 구성은 다음과 같습니다.
/boot : 부팅을 담당하는 부팅이미지가 들어있는 파티션입니다.
SWAP : 메모리 고갈시 하드디스크를 통한 메모리 저장소입니다.
/ : 파티션의 최상의 디렉토리 입니다.
위의 3가지가 기본적인 구성입니다. 예전에는 fdisk로 직접적인 경로를 설정하였지만, 해당 볼륨의 크기 변동이 힘들었던 점이 있습니다.  ex) /dev/sda3, /dev/sdb1... 허나 요즘은 LVM을 이용하여 볼륨 크기 조절을 마음대로 하실 수 있습니다. 따라서, 설치시 다음과 같이 설정하시면 향후 업그레이드 및 크기 조절이 가능하게 됩니다.
파티션 및 파일 타입 설명
/boot (ext4) 부팅의 경우 가상의 Extend가 되지 않으므로 직접적인 경로를 사용하게됩니다.
LVM Extend ( /boot를 제외한 남은 용량을 전체로 설정합니다. 이때, vg이름 설정후 진행하시면 됩니다.)
SWAP (LVM - swap) LVM 파티션으로 구성합니다. (lv_swap)
/ (LVM - ext4) LVM 파티션으로 구성합니다. (lv_root)
위와 같이 설정이 되었을 경우 다음과 같은 의문점이 생기실 겁니다.
사용자 삽입 이미지
1. LVM 에서 VG와 LV의 차이는 무엇인지..
Physical 볼륨은 말 그대로 물리 디스크를 뜻합니다. 물리 디스크를 합쳐서 만든 것이 볼륨 그룹 (VG)이며 ,  그안에서 세세히 나누어지는 것이 가상볼륨(LV)입니다. 따라서, 추후 추가적으로 구성시 위와 같이 설정을 하였을 경우 볼륨 조절이 가능한 것입니다. 용량은 선택적이며, 저의 경우 다음과 같은 용량으로 기준합니다.
 /boot : 500M (ext4)
SWAP : 링크참조
/ : 남은 용량 모두

기존 리눅스 시스템에는 다음과 같이 파티셔닝을 하였지만, 근래에는 파티셔닝을 간단하게 바뀌고 있습니다. 이유는 예전의 경우 디스크 용량이 적어 디스크 FULL 현상이 자주 발생하고, FULL일 경우 시스템에 접속도 되지 않는 현상이 발생되어 파티셔닝을 해 주었던 것입니다. 허나, 근래의 디스크 크기는 예전에 비하여 엄청난 발전이 되어 FULL 현상이 없으므로, 이에 대한 파티셔닝은 간단히 하셔도 된다고 생각하시면 될 듯 합니다. 보안적인 측면에서 fstab에 보안설정인 nosuid, noexec, nodev등을 넣어야 하지만, 이또한 mounting 옵션으로 설정이 가능하므로 굳이 디스크 파티셔닝을 따로 세세히 넣어줄 이유가 없답니다. 더 궁금하신 사항이 있다면 언제든 댓글 부탁드리겠습니다. 감사합니다.
2017/02/27 12:52 2017/02/27 12:52
2017/02/27 12:52

SWAP 메모리 설정

Posted by JParker
OS/Linux 2017/02/27 12:52
SWAP의 경우 예전 메모리가 모자르던 시절에는 약 메모리의 2배를 사용하였습니다. 현재에도 국내 업체의 경우 약 메모리의 2배로 설정하는 경우를 종종 보게 되었습니다. 기존의 메모리 2배의 경우는 1G 이하 시절에 사용하던 것으로 현재와는 맞지 않습니다. 따라서 다음과 같이 설정하는 것이 권장사항이라 할 수 있습니다.

Amount of RAM in the System Recommended Amount of Swap Space
4GB of RAM or less a minimum of 2GB of swap space
4GB to 16GB of RAM a minimum of 4GB of swap space
16GB to 64GB of RAM a minimum of 8GB of swap space
64GB to 256GB of RAM a minimum of 16GB of swap space
256GB to 512GB of RAM a minimum of 32GB of swap space

다음 사이트에서도 권장을 하고 있습니다. 관련 사이트 http://jmnote.com http://redhat.com
2017/02/27 12:52 2017/02/27 12:52
Tags , ,
2017/02/27 12:51

IBM의 IMM 사용시

Posted by JParker
OS/Linux 2017/02/27 12:51
안녕하세요? 오랜만에 글을 적습니다.
IBM장비에 RHCS를 구성시 IMM을 이용하려면 해당 포트에 대하여 enable을 해야 합니다.
노트북으로 다이렉트로 IMM 포트를 접속시키고 다음과 같이 작업을 하시면 됩니다.
노트북 아이피 : 192.168.70.124 / 255.255.255.0 (Gateway X )
브라우져로 https://192.168.70.125 로 접속하시면 IMM 관리자 포트를 접속하실 수 있습니다.
아이디는 USERID 패스워드는 PASSW0RD입니다. (0은 숫자 0입니다.)
이후 서버에서 작업시 중요한 점 한가지. 
IMM은 네트워크 디바이스중 USB0에 대하여 enabled하지 않으면 동작되지 않습니다.
따라서, 해당 IMM을 위하여 usb0를 ONBOOT = yes로 하여 동작하게 하여 주시고 BOOTPROTO는 DHCP로
설정을 하여 주시기 바랍니다.
즐거운 리눅싱 되시기 바라며...
2017/02/27 12:51 2017/02/27 12:51
Tags , ,
2017/02/27 12:50

IPv6 비활성화 시키는 방법

Posted by JParker
OS/Linux 2017/02/27 12:50
CentOS 의 /etc/sysctl.conf 파일에 아래와 같이 기술한 후, 재부팅하면 IPv6 가 비활성화된다.
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
적용 방법은 sysctl -p 명령을 이용하면 된다.
2017/02/27 12:50 2017/02/27 12:50
Tags , ,
2017/02/27 12:50

DRBD 서버 구성

Posted by JParker
OS/Linux 2017/02/27 12:50
일을 하다보니 여러 환경에서 신기한 작업(?)들을 많이 하게 됩니다. 이번에는 DRBD 환경 구축이 필요하여 아래와 같이 구성하였습니다. 필요하신 분들은 아래의 자료를 참고하여 구축해보시기 바랍니다. 문서의 저작권은 http://root.so, http://jaehun.org 를 운영하는 Jaehun, Park <jaehun@me.com>에게 있으므로, 출처를 반드시 밝혀주시기 바랍니다. 감사합니다.

구성 환경

  • RHEL 6.4 (64bit)
  • DRBD 8.4.0

구성 요건

  •  단일 Primary 모드

구성 개요

  1. DRBD 설치
  2. DRBD 설정파일 작성
  3. DRBD 기동
  4. 데이터 동기화 확인

서버 구성

Host Name   Address
node1 master 192.168.11.151
node2 backup 192.168.11.152
  Virtual IP 192.168.11.150

작업 내용

DRBB를 빌드 하기 위하여 필요한 패키지 설치
$ sudo yum install -y gcc make automake autoconf flex rpm-build kernel-devel \
  libxslt fakeroot
rpmbuild 구축에 앞서 필요로 하는 디렉토리 구조를 생성.
$ mkdir -p /home/help/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
소스 다운로드 (안정버전 drbd 8.4.0)
$ curl -O http://oss.linbit.com/drbd/8.4/drbd-8.4.0.tar.gz
다운로드한 소스를 풉니다.
$ tar zxvf drbd-8.4.0.tar.gz

configure스크립트를 실행.
$ cd drbd-8.4.0
$ ./configure
fakeroot를 이용하여 make를 실행합니다. fakeroot를 사용하는 이유는 RPM을 빌드하기 위함이며,  root권한이기 때문에 fakeroot가 root권한인 것 같이 표현합니다.
$ fakeroot make rpm km-rpm
아무이상없이 빌드가 완성되면 , 아래rpm이 작성된다.
$ ls -1 /home/help/rpmbuild/RPMS/x86_64/
drbd-8.4.0-1.el6.x86_64.rpm
drbd-bash-completion-8.4.0-1.el6.x86_64.rpm
drbd-heartbeat-8.4.0-1.el6.x86_64.rpm
drbd-km-2.6.32_71.el6.x86_64-8.4.0-1.el6.x86_64.rpm
drbd-pacemaker-8.4.0-1.el6.x86_64.rpm
drbd-udev-8.4.0-1.el6.x86_64.rpm
drbd-utils-8.4.0-1.el6.x86_64.rpm
drbd-xen-8.4.0-1.el6.x86_64.rpm
RPM 빌드 완료후 필요한 것은 drbd-utils와 drbd-km입니다. 물론 필요에 따라 해당 패키지를 설치 하시면 됩니다.
$ sudo rpm -ivh \
 /home/help/rpmbuild/RPMS/i386/drbd-utils-8.4.0-1.el6.x86_64.rpm \
 /home/help/rpmbuild/RPMS/i386/drbd-km-2.6.32_71.el6.x86_64-8.4.0-1.el6.x86_64.rpm
커널 모듈에 DRBD를 인식 시킵니다.
$ lsmod | grep drbd
$ sudo modprobe drbd
$ lsmod | grep drbd
drbd                  274063  0
libcrc32c                815  1 drbd
” /etc/init. d/drbd start "실행에 modprobe drbd가 실행되므로, 여기에서는 modprobe 명령어로 커널 모듈을 정상적으로 등록 할 수 있는 것을 확인하는 것입니다. 부팅시 자동으로 등록될 수 있도록 아래와 같이 서비스 등록을 시켜줍니다.
$ chkconfig --list drbd
drbd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

Device File 준비

본인의 경우 LVM으로 각각 100G, 75G 두개의 파티션을 준비했습니다. lv_data : 100G , lv_log : 75G

DRBD 설정

/etc/hosts에 호스트명을 등록해줍니다. 등록을 하는 이유는 config에서 IP를 지정하지만 호스트명을 IP로 변환하는 것을 실패하면 동작되지 않는 문제때문입니다.
$ sudo vi /etc/hosts
> 192.168.11.151 node1
> 192.168.11.152 node2

다음은 DRBD 설정 파일을 수정합니다. 설정 파일은 항상 res로 인식하도록 하고 있습니다.
disk 부분이 미리 준비해둔 LVM 파티션입니다. Volum은 node1과 node2에 따라 틀리므로 주의하시기 바랍니다.
/etc/drbd.d/data.res
resource data {
  protocol C;
  volume 0 {
    device      /dev/drbd0;
    disk        /dev/vg_cs1/data;
    meta-disk   internal;
  }
  volume 1 {
    device      /dev/drbd1;
    disk        /dev/vg_cs1/log;
    meta-disk   internal;
  }
  on node1 {
    address 10.10.10.11:7801;
  }
  on node2 {
    address 10.10.10.12:7801;
  }
}
DRBD 디바이스를 초기화합니다.
$ sudo drbdadm create-md data
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.
success
※주의: iptables가 구동중일 경우 DRBD 통신이 원활히 동작되지 않을 수 있으니 참고 바랍니다. DRBD 동작.
$ sudo /etc/init.d/drbd start
Starting DRBD resources: [
     create res: data
   prepare disk: data
    adjust disk: data
     adjust net: data
]
.....
DRBD를 스타트하면 /proc/drbd가 생성됩니다.
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@node1, 2013-10-14 15:10:50
 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:106628836 dw:106628836 dr:0 al:0 bm:6400 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:78640764 dw:78640764 dr:0 al:0 bm:4800 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
이 때, 어느 쪽도 Primary가 아닌 Secondary로 동작되는 것을 알 수 있습니다.

데이터 동기화 확인

Primary에서 파일을 작성하고,  Secondary에 데이터 동기화가 이루어지는 것을 확인합니다.

node1: (secondary→primary)

node1을 primary로 강제 변경합니다.
$ sudo drbdadm primary --force data
Primary로부터 Secondary에  동기화 처리가 시작되며, 용량에 따라 동기화 시간이 틀려질 수 있습니다. 저의 경우 약 1시간정도 걸렸습니다.
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:2664 nr:0 dw:0 dr:104855036 al:0 bm:0 lo:0 pe:3 ua:3 ap:0 ep:1 wo:b oos:128600
        [>....................] sync'ed:  3.2% (128600/104855036)K
        finish: 0:00:45 speed: 2,432 (2,432) K/sec
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:78640764 nr:0 dw:0 dr:78641436 al:0 bm:4800 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by centos@centos, 2011-11-08 16:16:36
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:131032 nr:0 dw:0 dr:131696 al:0 bm:8 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:78640764 nr:0 dw:0 dr:78641436 al:0 bm:4800 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
DRBD 디바이스를 확인해 보시면 설정한 대로 /dev/drbd0과 /dev/drbd1이 생성되었음을 알게 될 것입니다.
$ ls -la /dev/drbd0
brw-rw---- 1 root disk 147, 0 Nov  8 17:19 /dev/drbd0
기존 사용하던 디스크처럼 동일하게 DRBD 디바이스를 포맷하고, 마운트 하면 사용이 가능합니다.
$ sudo mkfs.ext4 /dev/drbd0
$ sudo mkfs.ext4 /dev/drbd1
$ sudo mkdir /data
$ sudo mount -t ext4 /dev/drbd0 /data
$ sudo mkdir /data/log
$ sudo mount -t ext4 /dev/drbd1 /data/log
마운트후 정상적으로 마운트가 되었는지 확인합니다.
$ ls -la /data
total 18
drwxr-xr-x   4 root root  4096 2013-10-14 18:12 .
dr-xr-xr-x. 28 root root  4096 2013-10-14 16:27 ..
drwxr-xr-x   3 root root  4096 2013-10-14 18:13 log
drwx------   2 root root 16384 2013-10-14 17:54 lost+found

primary·secondary간 데이터 동기되는 것을 확인하기 위해서, 파일을 생성해봅니다.
$ sudo touch /data/test.txt
$ ls -la /data/
total 28
drwxr-xr-x   4 root root  4096 2013-10-14 18:15 .
dr-xr-xr-x. 28 root root  4096 2013-10-14 16:27 ..
drwxr-xr-x   3 root root  4096 2013-10-14 18:13 log
drwx------   2 root root 16384 2013-10-14 17:54 lost+found
-rw-r--r--   1 root root     0 2013-10-14 18:15 test.txt

node1: (primary→secondary)

DRBD가 사용중이므로 secondary로 변경할 수 없으므로, 디바이스를 umount 합니다.
$ sudo umount /data/log
$ sudo umount /dat
DRBD의 모드를 Primary에서 Secondary모드로 변경합니다.
$ sudo drbdadm secondary data
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@node1, 2013-10-14 15:10:50
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:106628984 nr:0 dw:1774620 dr:104856149 al:498 bm:6400 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:80005452 nr:0 dw:1364688 dr:78642521 al:384 bm:4800 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

위와 같이 되었으므로, 기존 Secondary가 Primary로 변경할 수 있는 상태가 됩니다.

node2: (secondary→primary)

node2의 DRBD모드를 Primary로 변경합니다.
$ sudo drbdadm primary data
/proc/drbd에서 Primary가 되었는지 확인합니다.
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@node1, 2013-10-14 15:10:50
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:106628984 dw:106628984 dr:672 al:0 bm:6400 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:80005452 dw:80005452 dr:672 al:0 bm:4800 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
DRBD 디바이스의 내용을 확인하기위하여, 볼륨을 마운트합니다.
$ sudo mkdir /data
$ sudo mount -t ext4 /dev/drbd0 /data/
$ sudo mount -t ext4 /dev/drbd1 /data/log
mount된 디렉토리에서 node1에서 작성하였던 test.txt가 존재하는지를 확인합니다.

$ ls -la /data/ total 20 drwxr-xr-x 3 root root 1024 Nov 8 17:23 . drwxr-xr-x. 3 root root 4096 Nov 8 17:25 .. drwxr-xr-x 3 root root  4096 2013-10-14 18:13 log drwx------ 2 root root 16384 2013-10-14 17:54 lost+found -rw-r--r-- 1 root root     0 2013-10-14 18:15 test.txt

node2: (primary→secondary)

해당 /data/log와 /data 디렉토리를 umount 하고, secondary로 모드를 변경합니다.
$ sudo umount /data/log
$ sudo umount /data
$ sudo drbdadm secondary data
/dev/drbd에서 secondary로 모드가 변경되었는지 확인합니다.
$ cat /proc/drbd
version: 8.4.0 (api:1/proto:86-100)
GIT-hash: 28753f559ab51b549d16bcf487fe625d5919c49c build by root@node1, 2013-10-14 15:10:50
 0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:8 nr:106628984 dw:106628992 dr:1385 al:1 bm:6400 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:8 nr:80005452 dw:80005460 dr:1373 al:1 bm:4800 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
이것으로 node1, node2 둘다 secondary로 동작되고 있는 상태입니다. 추후 RHCS나 혹은 heartbeat를 이용하여 해당 클러스터로 묶어서 구동시키실 수 있습니다. 이로서 DRBD 구축에 대한 글을 마치겠습니다. 감사합니다.
2017/02/27 12:50 2017/02/27 12:50
Tags ,
2017/02/27 12:48

IBM 혹은 UEFI로 부팅 않될 경우

Posted by JParker
OS/Linux 2017/02/27 12:48
증상 : RHEL6 버젼 설치를 UEFI 모드로 설치 후 시스템 부팅시 아래와 같은 문구가 출력되는 현상
Invalid magic number: 0 Error 13: Invalid or unsupported executable format Press any key to continue...
원인 : Trusted Execution Technology와 tboot을  BIOS에서 지원합니다. 따라서 TXT와 tboot이 uEFI 모드가 동작중일 때에는 부팅을 할 수 없습니다. 따라서 tboot과 함께 사용하실 수 없습니다. 해결 : 설치시 패키지중 base (기본)에 고급을 보시면 tboot 패키지가 있습니다. 이것을 제외하시고 설치하시기 바랍니다.
2017/02/27 12:48 2017/02/27 12:48
Tags , ,
2017/02/27 12:47

리눅스 본딩 설정하기

Posted by JParker
OS/Linux 2017/02/27 12:47

Linux Bonding 설정하기

본딩이란?한대의 서버에 여러개의 랜카드를 이용하여 대역폭 또는 예비 회선으로 사용할 수 있도록 하는 전송 속도의 분배및 대비책으로 사용하기 위한 기술입니다. 윈도우에서는 티밍(teaming)이라고 불리우기도 하는 기술입니다.

Bonding 종류
  • Mode 0 (balance-rr) balance-round robine ( 2개의 NIC을 순차적으로 분배 + Fault Tolerance) 회선이 2회선일 경우 트래픽을 같이 사용할 수 있어 대역폭을 분산시키는데 효율적입니다. [ A nic -> B nic -> A nic -> B nic 순] 으로 패킷을 분산 시키는 방법입니다. 또한, 장애허용으로 인하여, 한쪽 네트워크에 단절이 오더라도 이를 보안하는 기능이 존재 합니다.
  • Mode 1 (active-backup) 일반 기업들이 많이 쓰고, 흔히들 말하는 네트워크 이중화에 대한 부분으로 사용되어집니다. 실제 사용시에는 2개의 백본에 2개의 NIC에 연결이 되며, 활성화 되어있는 NIC에 문제 발생시 예비 NIC으로 이첩시키는 기능을 합니다. 보통 IDC같은 곳에서는 이중화 보다는 같은 네트워크 스위치에 2회선으로 물려 사용하기도 합니다. 이 모드도 장애허용에 대하여 지원됩니다.
  • Mode 2 (balance-xor) XOR 방식에 따라 패킷을 전송합니다. (Source MAC Address가 Target MAC Address로 비트연산을 하여 ) 모드 0과 비슷하지만 근원지 MAC에서 목적지 MAC으로 비트 연산을 통하여 분배합니다. 보통 방화벽과 비슷한 방식이기는 하나 들어오는 리퀘스트에 MAC을 연결하는 방식입니다.
  • Mode 3 (broadcast) 모든 NIC에 동일한 패킷을 brocast로 발송합니다.
  • Mode 4 (802.3.ad) Dynamic Link Aggregation 정책으로 동작됩니다. speed와 duplex 설정을 공유하는 aggregation groups를 스위칭 장비에서 설정하여야 합니다. 단, 802.3.ad를 지원하는 스위치에서만 사용이 가능하며, 연결대수에 상관없이 그룹화에 따라 회선의 정책이 변경되어 무단절 인터넷 연결을 가능하게 만드는 방식입니다.
  • Mode 5 (balance-tlb) 로드 발랜싱 정책으로 밖으로 내보내지는 트래픽은 분산되어 송출되며, 들어오는 트래픽은 Active되어있는 NIC으로 패킷을 받습니다. 만일 Active 되어있는 NIC의 문제로 패킷을 받지 못하면 또다른 NIC이 실패한 NIC의 MAC Address를 물려받게 됩니다.
  • Mode 6 (balance-alb) 들어오는 트래픽을 분산 처리하여 받습니다. bond에서 트래픽이 많이 존재하지 않는 NIC으로 분산됩니다. 들어오는 로드 발렌싱은 ARP negotiation을 통해서 수행됩니다.

기본적인 부분
0 - RR(RoundRobin)방식 로드밸런스. 인터페이스의 라운드로빈(대역폭 상승 + Failover)
1 - Active-Standby (NIC 의 Failover 만을 위한 모드)
한개는 Standby로 기존 것이 문제 생길경우 active로 전환
2 - XOR 방식 / 수신시에는 MAC 어드레스로 매핑, 송신시 1번 NIC 사용
3 - Broadcast 방식 / 모든 Slave NIC 으로 통신 failover 제공
4 - 802.3ad Dynamic Link aggregation
5 - 송신패킷만 로드밸런싱 / 동일 스위치에 물려있어야 함
6 - 송수신패킷 로드밸런싱 / 동일 스위치에 물려있어야 함
Miimon 옵션은?
링크 감시설정 모드로 ms 단위를 사용하며 디폴트값이 0(사용안함)
즉, 0으로 설정하면 Failover가 비활성화되는 부분으로 사용하며,
기본적으로 리눅스에서는 100ms로 사용합니다.
Bonding 하기 지금부터는 CentOS를 이용하여 본딩하는 방법을 알려드리도록 하겠습니다. 이는 Redhat 계열에서는 많이 이용되며, 주로 많이 현업에서 많이 사용되는 것은 모드 1번(Active&Standby)을 사용합니다.
  1. /etc/sysconfig/network 설정 (기본 Gateway를 설정해 줍니다.) 맨 밑줄에 GATEDEV=bond0 추가
  2. /etc/sysconfig/network-scripts/ifcfg-bond0 설정
    DEVICE=bond0            # 연결 디바이스명
    BOOTPROTO=none          # Static (고정), DHCP, none, bootp 형식등이 있음
    ONBOOT=yes              # 부팅시 동작
    USERCTL=no              # 사용자컨트롤 금지
    TYPE=Ethernet           # 타입은 이더넷
    IPADDR=10.0.1.101       # IP
    NETMASK=255.255.255.0   # Netmask
    GATEWAY=10.0.1.1        # Gateway
    BONDING_OPTS=`mode=1 miimon=100 use_carrier=0 primary=eth0`
    
  3. /etc/sysconfig/network-scripts/ifcfg-eth(x) 설정 x=(ex:eth0,1)
    DEVICE=ethX           # 연결 디바이스명 (eth0,1)
    BOOTPROTO=none        # Static (고정), DHCP, none, bootp 형식등이 있음
    ONBOOT=yes            # 부팅시 동작
    USERCTL=no            # 사용자 컨트롤 금지
    TYPE=Ethernet         # 이더넷 타입
    MASTER=bond0          # MASTER는 Bonding 명
    SLAVE=yes             # 대비책으로 구성 (Master는 bond0이므로 Slave 그룹에 가입)
    
  4. /etc/modprobe.conf 설정내에 아래의 사항을 추가
    alias bond0 bonding
    options bond0 mode=1 miimon=100
    # 만일 두개의 본딩을 구성하셔야 한다면 아래 부분으로 이용하시기 바랍니다.
    alias bond0 bonding
    alias bond1 bonding
    options bonding max_bonds=2
    options bonding miimon=100 mode=1
  5. 모듈 로딩 및 네트워크 재시작.
    modprobe bonding # 본딩 모듈 로딩
    /etc/init.d/network restart 혹은 service network restart
    
  6. /proc/net/bonding/bond0 에서 bonding 확인
    Bonding Mode: fault-tolerance (active-backup) # 본딩 모드
    Primary Slave: None
    Currently Active Slave: eth0    # 현재 Active 디바이스명
    MII Status: up
    MII Polling Interval (ms): 100
    Up Delay (ms): 0
    Down Delay (ms): 0
    Slave Interface: eth0
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 1x:xx:xx:xx:e1:40
    Slave Interface: eth1
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 1x:xx:xx:xx:e1:41
    
위와 같이 정상적으로 동작이 된다면 이상없이 마무리가 된 것입니다. 모드에 따라 설정법이 다르니 참고 하시기 바랍니다.
2017/02/27 12:47 2017/02/27 12:47