뭘 이런걸..

Posted
Filed under Tech/Tip & Trick
MegaRAID 의 VD 의 device name 을 구하는 방법

일단, controller 별 device 정보는 다음에서 구할 수 있다

/dev/disk/by-path/*
/sys/block/*/device


이 두 경로 리스트의 softlink target 에 device name 이 존재한다.

[root@host ~]# ls -l /dev/disk/by-path/
합계 0
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:00:11.5-ata-3.0 -> ../../sdg
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part1 -> ../../sdg1
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part2 -> ../../sdg2
lrwxrwxrwx 1 root root 10 9월 5 01:30 pci-0000:00:11.5-ata-3.0-part3 -> ../../sdg3
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:17:00.0-scsi-0:2:0:0 -> ../../sda
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:17:00.0-scsi-0:2:1:0 -> ../../sdb
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:0:0 -> ../../sdc
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:1:0 -> ../../sdd
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:2:0 -> ../../sde
lrwxrwxrwx 1 root root 9 9월 5 01:30 pci-0000:b3:00.0-scsi-0:2:3:0 -> ../../sdf


by-path 의 장점은 위의 정보와 같아 cotroller 에 연결이 안되어 있는 disk 가 존재하는 경우을 처리할 수 있다는 장점이 있으나, CentOS 5 이전의 경우에는 by-path를 지원하지 않는 단점이 있다. CentOS 5 에서도 커널 버전에 따라 지원되고 안되고의 차이가 발생할 있다.

/sys 는 아래와 같다.

[root@a1page074.ndrive z]# ls -l /sys/block/sd*/device
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sda/device -> ../../../0:2:0:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdb/device -> ../../../0:2:1:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdc/device -> ../../../12:2:0:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdd/device -> ../../../12:2:1:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sde/device -> ../../../12:2:2:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdf/device -> ../../../12:2:3:0
lrwxrwxrwx 1 root root 0 8월 30 12:06 /sys/block/sdg/device -> ../../../3:0:0:0


/sys 의 경우 /sys 를 지원하는 커널에서는 다 사용을 할 수 있지만, 위와 같이 controller 에 연결이 되어 있지 않은 device 를 솎아 내기가 좀 애매하다.

여기서는 경우의 수를 될 수 있으면 많이 처리하기 위하여 /dev/disk/by-path 를 이용하여 구하는 코드를 만들어 볼 것이다.

일단, MegaRAID 를 사용하는 device 만 솎아 내기 위하여 PCI table 을 확인한다.

[root@host ~]# lspci | grep -E "LSI|Dell|IBM|MegaRAID"
17:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)
b3:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)


여기서 주의할 것이 sort 를 해서는 안된다. 여기에 나오는 순서가 MegaCLI 에서 나오는 controller 의 순서와 동일하다. 이 정보의 첫번째 필드만 있으면 된다.

그럼 by-path 에서 controller 정보와 VD 정보는 어떻게 매핑 하면 되는지 보겠다.

pci-0000:17:00.0-scsi-0:2:0:0
pci-0000:{PCI_TABLE_NUMBER}-scsi-0:2:{VD_NUMBER}:0


위와 같은 규칙을 이용하여 찾도록 한다. 그럼 완성된 코드는 다음과 같다.

idx=0
for rc in $(lspci | grep -E "LSI|Dell|IBM|MegaRAID" | sort | awk '{print $1}')
do
bypath="$(
ls -l /dev/disk/by-path/pci-0000:${rc}-* 2> /dev/null | awk -v ctrlidx=${idx} '
{
n = split ($(NF-2), A, ":");
vdnum = A[n-1]
dev = gensub (/.*\//, "", "g", $NF);

print ctrlidx ":" vdnum ":" dev

#print $(NF-2) " " $NF
}
'
)"
echo "$bypath"
let "idx++"
done


위의 코드의 결과는 다음과 같다.

controller_number:VD_number:device_name
0:0:sda
0:1:sdb
1:0:sdc
1:1:sdd
1:2:sde
1:3:sdf
2019/09/05 13:19 2019/09/05 13:19
Posted
Filed under Tech/Tip & Trick
MariaDB 10.4 부터 mysql database 의 user table 에 변경이 발생했습니다.

mysql> UPDATE USER SET Password = password('PASS_STRING');
mysql> flush privileges;

위와 같이 기존의 방식으로 변경을 하면 다음과 같은 에러가 발생 합니다.

ERROR 1348 (HY000): Column ‘Password’ is not updatable.

이 이유는, 10.4 부터는 user table 이 없어지고 global_priv table 이 그 역할을 대신 하기 때문입니다. show tables 시에 보여지는 user table은 global_priv 등의 table를 이용하여 view 로서 대신 하게 되었기 때문에 user table 을 update 하는 것이 불가능 합니다.
MariaDB [mysql]> SHOW FULL TABLES IN mysql WHERE TABLE_TYPE LIKE 'VIEW';
+-----------------+------------+
| Tables_in_mysql | Table_type |
+-----------------+------------+
| user | VIEW |
+-----------------+------------+
1 row in set (0.007 sec)

https://mariadb.com/kb/en/library/authentication-from-mariadb-104/

위의 문서를 읽어 보시면 몇가지 특징이 있는데, mysql 10.4 부터는 더이상 mysql 의 root 계정에 대한 암호를 기본적으로는 물어보지 않습니다. 이 이유는 오직 root account 로 mysql client 를 실행 했을 경우에만 암호가 없이 동작을 하며, 기타 다른 일반 account 로는 -u root 를 이용하여 접속이 불가능 함을 의미합니다. 즉, 일반 유저로 mysql root 연결이 필요 없다면, 더이상 mysql root 암호를 지정할 필요가 없다는 얘기입니다.

역설적으로 일반 account 에서 mysql root 로 연결을 할 필요가 있다면 mysql root 암호를 변경해 주어야 한다는 얘기도 됩니다.

여기서는 일반 account 에서 mysql root 로 연결을 하고 싶을 때 root account 의 암호를 변경하는 방법입니다.

일단은
SELECT password('PASSWORD_STRING');
query 를 이용하면 암호화된 문자열을 얻을 수 있습니다. 이 정보를 가지고 global_priv table의 Priv field 의 값을 수정해 주면 됩니다. (https://www.reddit.com/r/sysadmin/comments/avx1u6/how_to_change_the_root_password_with_mariadb_104/ 참조)

하지만 이렇게 하면 굉장히 번거롭기 때문에 다음과 같이 query 하나로도 변경이 가능 합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD_STRING';




단, mariadb 10.3 이하 버전에서 업그레이드를 하여 mysql_upgrade 를 실행한 경우에는, 위의 조건이 성립하지 않습니다. mysql_upgrade 를 이용하여 mysql table을 10.4 용으로 업그레이드 한 경우에는 기본의 mysql database 의  table 들이 유지가 되게 됩니다. 즉, 이 경우에는 global_priv database 가 생성이 되지 않고 user table 이 view가 아니라 여전히 table 이 되게 됩니다.
2019/08/12 16:37 2019/08/12 16:37
Posted
Filed under 분류없음
TLS 1.3 지원을 하려면 openssl 1.1 이상이 필요 합니다.
현재 CentOS 7 이나 안녕 3 에서는 지원이 안된다는 얘기죠. 물론 openssl 1.1 을 별도 위치에 설치해 놓고 link를 하는 방법은 가능 합니다. 단순히 배포본 기본 패키지로 지원을 하지 않는 다는 것을 언급 하는 것입니다.

일단, 안녕 3에 TLS 1.3 지원을 위하여 openssl 1.1 관련  compat 패키지들을 등록해 놓았습니다. 조만간 SSL을 사용하는 패키지들을 모두 openssl 1.1 로 link를 변경하여 안녕 3에서 지원이 가능하게 할 예정 입니다.

작업을 마치면, CentOS 7 에서 이 패키지들을 사용할 수 있는 방법도 올려 보도록 하겠습니다.
2019/06/02 23:43 2019/06/02 23:43
Posted
Filed under Tech/프로그래밍
3/17 에 putty 0.71 이 release 가 되었네요. iPuTTY 0.71 release 를 시작 해야겠습니다.

0.70 에서 0.71 release 되기 까지 꽤 오랜 시간이 되었고, commit 양도 어마어마하네요. iPuTTY 에 반영한 변경 사항이 잘 merge가 될지 모르겠습니다. 좀 자주 release 해 주는게 merge 하는데는 더 편할 수도 있을 것 같네요.
2019/03/24 04:20 2019/03/24 04:20
김정균

설정 파일 저장하는 부분의 api declare 가 완전히 변경이 되어 시간이 소요되고 있습니다. iPuTTy에서 설정파일을 파일로 저장하는 기능이 있는데, 이 부분을 완전히 새로 작성해야 할 것 같네요.

Posted
Filed under 분류없음
현재 접속해 있는 host가 vm guest 인지 아닌지 여부를 확인 하는 방법은 보통 다음과 같다.

1. dmidecode 에서 Xen 또는 VMware 가 있는지 찾기
2. Xen guest의 CentOS 6 이하는 dmidecode를 제대로 지원하지 않는 경우가 많은데, 이 경우에는 ps 명령에서 xenbus 를 찾는 방법이 있다.

여기서 논하는 방법은 CPU ID를 확인하는 방법인데, VMWare 문서에 의하면 다음과 같이 소개하고 있다.

Intel 및 AMD의 CPU는 CPUID 리프 0x1의 ECX의 비트 31을 하이퍼 바이저 존재 비트로 예약하고 있습니다. 이 비트에 의해 하이퍼 바이저는 게스트 OS에 그 존재를 나타낼 수 있습니다. 하이퍼 바이저는이 비트를설정하여 실제 CPU (모든 기존 CPU와 장래의 CPU)는이 비트를 0으로 설정합니다. 게스트 OS는 31 비트를테스트하여 그 하이퍼 바이저가 가상 머신 내에서 실행되고 있는지를 확인할 수 있습니다.

Intel 및 AMD는 소프트웨어에서 사용할 수 있도록 CPUID 리프 0x40000000 ~ 0x400000FF도 예약하고 있습니다. 하이퍼 바이저는 이러한 리프를 사용하여 하이퍼 바이저에서 가상 머신 내에서 실행되는 게스트 OS에 정보를 전달하기위한 인터페이스를 제공 할 수 있습니다. 하이퍼 바이저 비트는 하이퍼 바이저가 존재하는 것을 의미하며 이러한 추가 소프트웨어 리프를 테스트하는 것이 안전하다는 것을 보여줍니다. VMware는 0x40000000 리프를 하이퍼 바이저 CPUID 정보 리프로 정의합니다. VMware 하이퍼 바이저 코드를 실행함으로써 하이퍼바이저 서명이 있는지 CPUID 정보 리프를 테스트 할 수 있습니다. VMware는 CPUID 리프 0x40000000의 EBX, ECX, EDX에 "VMwareVMware"라는 문자열을 저장합니다.

이 내용을 C code 로 만들면 다음과 같다.


#include <stdio.h>
#include <string.h>

// https://stackoverflow.com/questions/6491566/getting-the-machine-serial-number-and-cpu-id-using-c-c-in-linux
static inline void cpuid (unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
{
/* ecx is often an input as well as an output. */
asm volatile (
"cpuid"
: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
: "0" (*eax), "2" (*ecx)
);
}

// https://kb.vmware.com/s/article/1009458
int cpuid_check (void) {
unsigned int eax, ebx, ecx, edx;
char hyper_vendor_id[13];
//cpuid(0x1, &eax, &ebx, &ecx, &edx);
eax = 0x1;
cpuid (&eax, &ebx, &ecx, &edx);

// bit 31 of ecx is set
// 0x8000000 10000 0000 0000 0000 0000 0000 0000 0000
if ( ecx >= 0x80000000 ) {
//cpuid(0x40000000, &eax, &ebx, &ecx, &edx);
eax = 0x40000000;
cpuid (&eax, &ebx, &ecx, &edx);
memcpy (hyper_vendor_id + 0, &ebx, 4);
memcpy (hyper_vendor_id + 4, &ecx, 4);
memcpy (hyper_vendor_id + 8, &edx, 4);
hyper_vendor_id[12] = '\0';

//printf ("This is GuesVM %s\n");
//printf ("##################### %s\n", hyper_vendor_id);

// VMwareVMware
if ( ! strncmp (hyper_vendor_id, "VMware", 6) )
return 0; // Success - running under VMware
// XenVMMXenVMM
else if ( ! strncmp (hyper_vendor_id, "XenVM", 5) )
return 0; // Success - running under Xen
}

return 1;
}

int main (void) {
// if guest vm return 0 and case others, return 1
return cpuid_check ();
}


이 코드는 VMWare EX 5.1 이상에서 정상 동작 함을 확인 했고, Xen server의 경우 7 에서 정상 동작하며, Xen server 6.5의 경우 CentOS 6.x 이하에서는 CPU  id 에서 해당 영역값을 읽어오지 못한다. 즉, legacy system에서는 동작하지 않을 수 있다.
2019/01/30 13:30 2019/01/30 13:30
Posted
Filed under Tech/프로그래밍
iPuTTY 0.70.2 release 소식 입니다.

왠만하면 PuTTY 0.71 을 기다리려고 하고 있는데, release 될 생각이 없는 듯 싶네요.  뭐 PuTTY 가 거의 보안버그 나올 경우만 업데이트 되는 경향이 강해서.. 0.61 출시 때 처럼 몇년이 걸릴지 모르겠습니다.

그래서 일단, iPuTTY의 기능에 대한 업데이트로 release 를 합니다.
0.70.2 의 주요 내용은, ZMODEM 기능 개선이며, 드디어 Drag & Drop 으로 ZMODEM 파일 전송이 가능해졌습니다.

ZMODEM 사용법에 대해서는 https://github.com/iPuTTY/iPuTTY/wiki 의 ZMODEM 항목을 참고 하세요.

Download: https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70.2i

Changes:

  • ZMODEM Drag & Drop 지원 (#41)
  • ZMODEM 의 sz 파일 경로 체크 오류 수정 (#40)
2018/10/07 21:54 2018/10/07 21:54
Posted
Filed under Tech/Tip & Trick
10년도 더 된 LinkSys srw2024 switch 의 CLI mode 설정과 LLDP 를 지원 하는 방법에 대하여 기록 합니다. (까먹을 까봐 기록하는 겁니다. ^^)

재미 있는 건, 이 switch가 L3 도 지원을 한다는 것이었네요. 이제껏 모르고 있었습니다. ^^;

1. CLI mode 사용하기


srw2024 는 WebUI를 제공하기는 하지만, IE 전용이고, 굳이 말하자만 IE 7 전용이라고 봐야 합니다. 즉, IE 7 이 후 버전에서는 제대로 randering 을 하지 못한다는 의미입니다. WebUI를 사용하기 위해서는 개발자 도구를 열어서 문서모드와 사용자 에이전트 문자열을 조작한 다음 접속을 해야 한다는 의미 입니다.



상당히 불편 합니다. 그래서 CLI 모드를 사용하기 위해서는 ssh 연결을 할 수 있습니다. user 명은 다시 입력을 받기 때문에 신경쓰지 않아도 됩니다. ssh 로 접속을 하면 다음과 같이 인증 화면이 뜹니다. User Name 과 Password 입력창 간의 전환은 TAB 키로 이동할 수 있습니다.



로그인을 하면 다음과 같이 Memu가 나옵니다.



WebUI 와 거의 비슷하지만, 4. System Mode (Layer 2 / Layer 3) 메뉴가 더 추가 되어 있고, 여기서 L3 switch 로 전환이 가능 합니다. 이 부분은 여기서 논하지는 않을 예정입니다. 관심있는 분들은 살펴 보시기를.. (그런데 이 switch를 아직 쓰는 사람들이 있을지..)

이렇게 ssh console 로 접속을 해서 cli mode 라고 하기는 좀 그렇습니다. 이 메뉴만으로 할 수 없는 일들이 많이 있습니다. LinkSys switch는 Cisco switch 와 같으 CLI 환경이 숨어 있습니다. 이 화면에서 Ctrl-Z 를 누르면 숨어 있는 CLI mode 로 들어갈 수 있습니다.



위의 화면은 CTRL-Z를 입력 했을 때 prompt가 뜬 상태 입니다. 처음 prompt 가 뜰 때는 마지막 memory log 를 출력하기 때문에 위의 화면 처럼 나오는데, 실제로는 제일 처음의 > 문자가 prompt 이고, 그 뒤는 log 가 출력이 된 것입니다. 이 화면에서 도움말을 보고 싶으면 ? 를 입력 하면 됩니다.



무언가 명령이 나왔습니다. :)
우리의 목적은 Cisco switch 의 cli 설정 환경 입니다. 그러므로, 여기서는 lcli 명령을 실행 하도록 합니다.



cli 모드로 진입을 하려면 다시 로그인을 해야 합니다. 위와 같이 인증을 하면 cli 모드로 진입이 됩니다. cli 모드에서 help 명령은 ? 문자를 입력하면 됩니다. (enter key를 입력할 필요가 없습니다.)





lcli 로 집입한 상태는 cisco 처럼 config 상태가 아닙니다. 설정을 변경 하기 위해서는 cisco와 같이 configure 모드로 진입을 해야 합니다.



configure 모드에서 ? 를 입력하면 아래와 같이 사용할 수 있는 명령어 목록들이 출력이 됩니다.




2. LLDP 설정 하기


이 문서는 단순히 기록을 위한 것이기 때문에 LLDP가 무엇인지에 대해서는 논하지 않습니다.

srw2024 는 기본적으로 LLDP 설정이 disable 이며, 또한 enable 역시 설정 화면에서 할 수가 없고 snmp를 이용해야 합니다. 그러므로 snmp 설정이 필요 합니다.

WebUI 를 이용하든, CLI 모드를 이용하든 snmp rw가 가능한 community를 생성해 줍니다.

gwi.kldp.org# conf
gwi.kldp.org(config)# snmp-server community lldpset rw


다음 swtich 에 연결이 되어 있는 net-snmp-utils 패키지가 설치된 시스템에서 다음 명령으로 확인을 합니다.

[root@kill ~]$ snmpwalk -v2c -c lldpset gwi.kldp.org 1.3.6.1.4.1.3955.89.110.1.1.1.0
SNMPv2-SMI::enterprises.3955.89.110.1.1.1.0 = INTEGER: 2


위와 같이 OID의 값이 2일 경우에는 LLDP 설정이 disable 인 상태 입니다. LLDP 설정을 enable 하기 위하여 다음과 같이 명령을 실행 합니다.

[root@kill ~]$ snmpset -v2c -c kldp gwi.kldp.org 1.3.6.1.4.1.3955.89.110.1.1.1.0 i 1
SNMPv2-SMI::enterprises.3955.89.110.1.1.1.0 = INTEGER: 1


잘 설정이 되었는지 확인을 합니다.

[root@kill ~]$ snmpget -v2c -c kldp gwi.kldp.org 1.3.6.1.4.1.3955.89.110.1.1.1.0
SNMPv2-SMI::enterprises.3955.89.110.1.1.1.0 = INTEGER: 1


LLDP 가 enable 되었다면 잘 되었는지 확인을 합니다. switch cli mode로 진입 하여 아래와 같이 확인 합니다.

gwi.kldp.org# show lldp nei
Port Device ID Port ID System Name Capabilities
------- ----------------- ----------------- ------------------- ------------
3 00:31:b5:c7:64:32 00:31:b5:c7:64:32 netgear.kldp.org H
6 00:36:29:43:61:dc 00:36:29:43:61:dc cicso.kldp.org H
8 00:3e:24:c1:19:64 00:3e:24:c1:19:64 O
gwi.kldp.org#


확인이 잘 되면, rw 모드로 생성했던 commnunity를 ro로 변경해 줍니다.

console# conf
console(config)# snmp-server enable
console(config)# snmp-server community lldpset ro


삭제를 하고 싶다면, web UI를 이용하여 삭제할 수 있습니다. (이래저래 귀찮습니다. 한 곳에서 깔끔하게 되지를 않네요.


2018/08/11 15:45 2018/08/11 15:45
Posted
Filed under Tech/프로그래밍
0.70.1 release 소식 입니다.

0.70.1 은 iPuTTY 수정 사항에 대한 bug 나 신 기능에 대한 업데이트 입니다.

Download: https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70.1i

Changes:


  • Vista 이후 사용되지 않는 ONTHESPOT 패치 코드 제거 (#20)
  • OTP와 같은 2 단계 인증 시에 저장되어 있는 암호가 잘못 입력 되는 문제 수정 (#31)
  • 명령행으로 실행 시에, 파일 세션을 불러오지 못하는 문제 수정 (#33)
  • 명령행으로 실행 시에, ssh:putty: 지원 (#35)
  • ZMODEM 단축키 지원 (#36) - 받기 F11 / 보내기 F12
  • MacOS의 SSH server로 로그인 시에, NFC 문제로 한글이 깨져 보이는 문제 수정 (#38)
  • 암호 저장시에, 암호 길이가 3의 배수일 경우 로그인 실패하는 문제 수정 (#39)



2018/04/29 22:23 2018/04/29 22:23
Posted
Filed under Tech/안녕리눅스
Apache 2.4.33 에 experimental 로 mod_md 라는 새로운 모듈이 추가가 되었습니다. (실제로는 2.4.30 에 추가가 되었으나, 2.4.30 이 release 되지 않고 2.4.33으로 relelase 가 되었습니다.)

ACME protocol 을 이용하여 인증서 자동 관리를 해 주는 모듈이라고 보면 됩니다. 일단은 현재 ACME protocol을 지원하는 곳이 Let's encrypt 밖에 없으므로, Let's encrypt 인증서 전용이라고 할 수 있습니다.

mod_md 모듈을 이용하면 아주 쉽게 인증서 설정 및 관리를 할 수가 있습니다. (인증서 발급 같은 것도 신경쓸 필요가 없습니다.)

일단 간단하게 예를 들자면

<VirtaulHost *:80>
ServerName oops.org
ServerAlias www.oops.org
</VirtaulHost>


이런 가상 호스트를 SSL 서비스를 하기 위하여 다음의 설정으로 간단히 가능해 집니다.

<IfModule md_module>
MDomain oops.org
MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf

<VirtaulHost *:443>
ServerName oops.org
ServerAlias www.oops.org
SSLEngine On
</VirtaulHost>
</IfModule>


이렇게 설정 한 후에 Apache 를 시작을 하면, oops.org 에 대한 인증서 발급을 시작 합니다. tail 명령으로 error_log 를 보고 있으면, 재시작 후 5~10초 정도가 지나면 다음과 같은 로그가 출력이 됩니다.

[root@host ~]# tail -f /var/log/httpd/error_log
[Tue Apr 10 23:53:51.043029 2018] [md:notice] [pid 88797] AH10059: The Managed Domain oops.org has been setup and changes will be activated on next (graceful) server restart.


이 로그가 출력이 되면 apache 를 다시 한번 재시작 해 주면 인증서가 자동 생성이 된 것을 확인할 수 있습니다. 더군다나, MDRenewWindow 를이용하면 자동 갱신도 가능하면, ServerAlias 의 도메인들은 SubjectAltName 으로 자동으로 등록이 됩니다. 즉, 도메인 발급 갱신에 대해서 신경을 꺼도 된다는 의미가 됩니다.

인증서는 SERVER_ROOT/md 에 저장이 되며, 이 위치는 MDStoreDir 지시자로 변경할 수 있습니다.

현재는 apache module 만 지원이 되는 듯 하며 조만간 nginx 도 지원을 하지 않을까 싶습니다.

mod_md에 대한 자세한 사항은 https://httpd.apache.org/docs/trunk/mod/mod_md.html 를 참조 하십시오.

안녕 리눅스 3에서는, httpd 2.4.33 부터 mod_md package 를 설치하여 사용이 가능 합니다.

빌드 시의 참고 사항으로는, 다음의 조건이 있습니다.

apr >= 1.5.2
libcurl > 7.50
brotli

안녕 리눅스에서는 apr 1.5.2 의 apr_escape call 을 back porting 하여 지원하였으며, brotli 는 설치 하지 않았음에도 잘 동작하는 것으로 보아 mod_md 와는 직접적인 연관이 없는 것으로 보입니다. 그리고, libcurl 도 mod_md 의 config2.m4 를 수정하여 CentOS 7의 libcurl 7.29 를 이용하여 빌드 하였으며, 아직까지는 문제점이 보이지는 않고 있습니다. 즉, apr 만 해결하면 CentOS 7에서 빌드는 그리 어려운 편은 아닙니다.

P.S.
mod_md는 mod_watchdog 모듈에 의존성이 있습니다. mod_watchdog 모듈을 mod_md 보다 먼저 load 해 주어야 합니다.
2018/04/11 00:07 2018/04/11 00:07
Posted
Filed under security
Intel Meltdown, Spectre 버그가 알려 진지도 한 5일 정도 지났고, 슬슬 패치들과 firmware들이 나오기 시작했습니다.

현재 알려진 바로는 3가지의 버그가 존재하고, 2가지는 Spectre, 1가지는 Meltdown 버그라 칭해지고 있습니다.


이 글은 Spectre bug와 Meltdown bug를 소개하는 것이 목적이 아닙니다. 이 버그에 대한 기술적인 글들은 많이 올라와 있으므로, 여기서는 RHEL/CentOS 환경에서 어떻게 적용할 것인가에 대하여 논하려 합니다.


일단, 버그가 알려진지 5일 정도 지난 시점에서, 벤더 별 OS kernel patch가 발표 되고, H/W 벤더들의 bios firmware 들이 발표가 되고 있는 상황에서 성능 저하 이슈와 패치 적용 이슈를 어떻게 해야 하는지에 대하여 논하려고 합니다.

현재, 나오고 있는 H/W bios patch는 CVE-2017-5715 (variant 2) 에 대해서만 해결을 하고 있으며, bios 만으로 해결은 안되고 software 적인 patch(즉 kernel patch)도 같이 필요한 상황입니다.

CVE-2017-5753 (variant 1)과 CVE-2017-5754 (variant 3)은 H/W 적으로 수정이 불가능 하고 software 적으로만 해결이 가능 합니다. 그리고 성능 저하의 문제는 CVE-2017-5754 (variant 3) meltdown patch에서 발생을 하게 됩니다.

meltdown patch의 경우 user 영역에서 kernel 영역의 memory 주소를 알지 못하게 하기 위하여 page table을 isolate 시켜 버리는데, 문제는 page table이 분리되다 보니 kernel syscall 이 호출 될 때 마다 분리된 kernel page table도 매번 호출이 되어야 하는 overhead가 발생하여 성능이 저하가 되는 것 입니다.

이 3가지 패치에 대하여 RHEL/Centos 의 커널은 3가지 옵션을 제공 합니다. (패치가 적용된 커널들은 /sys에 다음의 파일들이 생성되며, 파일 값은 1이 기본 입니다.)

[root@host ~]# cat /sys/kernel/debug/x86/pti_enabled
1
cat /sys/kernel/debug/x86/ibpb_enabled
1
cat /sys/kernel/debug/x86/ibrs_enabled
1


CentOS 6 의 경우에는 /sys/kernel/debug 를 아래와 같이 mount 해 주어야 합니다.

[root@host ~]# mount -t debugfs nodev /sys/kernel/debug



Intel CPU의 경우,

variant #1, #2, #3 을 모두 fix

[root@host ~]# echo "1" > /sys/kernel/debug/x86/pti_enabled
[root@host ~]# echo "1" > /sys/kernel/debug/x86/ibpb_enabled
[root@host ~]# echo "1" > /sys/kernel/debug/x86/ibrs_enabled


microcode update가 필요 없는 아주 오래된 intel cpu의 경우

[root@host ~]# echo "1" > /sys/kernel/debug/x86/pti_enabled
[root@host ~]# echo "0" > /sys/kernel/debug/x86/ibpb_enabled
[root@host ~]# echo "1" > /sys/kernel/debug/x86/ibrs_enabled


와 같이 해 주시면 됩니다.


AMD cpu의 경우에는 meltdown 은 적용이 필요 없으며,

H/W patch (bios upgrade)가 가능할 경우

[root@host ~]# echo "0" > /sys/kernel/debug/x86/pti_enabled
[root@host ~]# echo "0" > /sys/kernel/debug/x86/ibpb_enabled
[root@host ~]# echo "2" > /sys/kernel/debug/x86/ibrs_enabled


microcode 업데이트 없이 분기 예측을 사용할 수 없는 오래된 CPU의 경우

[root@host ~]# echo "0" > /sys/kernel/debug/x86/pti_enabled
[root@host ~]# echo "2" > /sys/kernel/debug/x86/ibpb_enabled
[root@host ~]# echo "1" > /sys/kernel/debug/x86/ibrs_enabled


로 해 주시면 됩니다.

물론 이 설정들은 runtime 설정이 가능 하며, 대신 persist 하지 않으므로 booting 시 마다 처리를 해 주어야 합니다. 또한, rc.local 에서 처리를 할 경우 rc.local 보다 먼저 실행되는 process 의 경우에는 이 설정의 영향을 받지 않기 때문에 기본 설정은 booting 시의 kernel parameter로 반영 하는 것이 좋습니다. 각 옵션에 해당하는 kernel parameter는 다음과 같습니다. (설정 값을 0으로 하는 것과 같습니다.)

noibrs noibpb nopti

여기까지는 아주 원론적으로 bug를 fix 하는 방법에 대하여 알아 보았습니다.

이 정보를 토대로 하면, spectre bug와 meltdown bug에 대하여 각각 정책을 취할 수 있게 됩니다. 예를 들어, 보안 버그가 중요하지만 성능 저하가 더 큰 문제인 경우, 해당 서버가 isolate 가 되어 있다면 과감하게 meltdown bug patch를 포기하는 정책도 가능 하다는 의미입니다.

현재, 이 기능을 사용할 수 있는 커널은

CentOS 7 3.10.0-693.11.6.el7
CentOS 6 2.6.32-696.18.7.el6
부터 사용이 가능 합니다. 물론, 이전 커널들은 page table isolate 같은 것을 하지 않았으니 이 기능 자체가 필요 없는 것이고요.

이 정보를 토대로 spectre meltdown 버그에 대한 정책을 결정하는데 도움이 되기를 바랍니다.

이 문서는 https://access.redhat.com/articles/3311301 문서를 토대로 작성을 하였음을 밝힙니다.
2018/01/09 22:21 2018/01/09 22:21
김정균

https://access.redhat.com/articles/3311301 에 업데이트 된 내용이 있습니다.

retp_enabled 이 추가가 되었습니다.
영구적으로 적용하지 않는 옵션은 "spectre_v2=off nopti" 이렇게 kernel parameter에 넣어도 된다고 하는 군요. 링크 페이지 참조 하시기 바랍니다.

retp_enable 는 google이 발표한 성능 저하 없는 spectre retpoline 패치 기능을 의미하는데, gcc 도 같이 업데이트가 되어야 합니다. 단, skylake 에서는 retp 대신에 ibrs 를 사용한다고 되어 있습니다.

즉, CentOS 에서 retp_enable 을 사용하려면, gcc 와 libgcc 도 같이 최신 버전으로 업데이트 되어야 합니다.

hong

CentOS 6.9랑 7.4 만 패치가 보이는데요 6.6 이나 7.0 같은 이외버전은 커널 어떤거 받으면 될까요? ㅠㅠ

김정균

6.6 이나 7.0 의 경우에는 RHEL 의 정책에 의해 별도로 license 계약을 체결해야 합니다.

또는, 6.9 나 7.4 로 업데이트를 해 주시면 됩니다. 업데이트는 간단하게 yum update 명령으로 업데이트가 가능 합니다. 6.x 나 7.X 간의 업데이트는 최소한의 하위 호환성을 보장 하면서 update 되기 때문에 update가 힘든 편은 아닙니다. 특시 APM 위주의 서비스는 그냥 업데이트를 따라 가셔도 거의 무방 합니다.