뭘 이런걸..

Posted
Filed under Tech/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 위주의 서비스는 그냥 업데이트를 따라 가셔도 거의 무방 합니다.

김정균

2017.12.19 자로 나온 1.31 적용 해 놓았습니다.

- jsdelivr 50M 제한 정책 때문에 1.31 부터는 svg, ttf format을 serving 하지 않습니다.
- ligature 기능은 d2coding-legature 로 분리 되었습니다.

jsdelivr 의 새로운 backend 에서 파일이 추가 삭제될 때 더이상 pull request를 던지지 않아도 되도록 변경이 되었네요 :)

Posted
Filed under Tech/안녕리눅스
2017년 08월 01일에 RHEL 7.4가 release 가 되었습니다. RHEL 7.4에 대응하는 안녕 리눅스 버전은 3.2 Aang 입니다.

RHEL 7.4는 binary level의 package를 배포하지 않고, 또한 안녕 리눅스는 RHEL이 아니라 CentOS 를 기반으로 릴리즈를 하기 때문에, CentOS 7.4 가 release 되어야 안녕 리눅스도 이에 맞춰 3.2가 출시 되게 됩니다.

일단, CentOS 7.4 는 블로그상에 의하면 8/22 ~ 9/12 사이에 출시를 하게 될 것이라고 언급 하고 있습니다. 그래서 안녕 리눅스 역시 CentOS 7.4가 출시되면 바로 출시가 가능 하도록 준비를 하고 있습니다.

안녕 리눅스 3.2 릴리즈를 위해서는 대략 25개의 package가 준비가 되어야 하며, 현재 10개의 패키지가 준비가 되었으며, binary 의존성이 없는 6개의 패키지는 이미 선 배포가 되고 있습니다.

CentOS 7.4 릴리즈 전에 대부분의 패키지는 선반영이 될 예정이며, CentOS 7.4의 bianry package 버전 의존성이 있는 (systemd 등 일부 패키지) 패키지들과 annyung-release 패키지는 CentOS 7.4가 릴리즈 된 이후 바로 배포가 될 예정입니다. (packaging은 CentOS 7.4 release 이전에 완료될 예정입니다.)
2017/08/21 00:03 2017/08/21 00:03
김정균

안녕 3.2 출시 준비를 마쳤습니다.

일단, CentSO 7.4 업데이트에 해당되는 안녕의 package 들은 이미 repository에 선 반영이 되어 있으며, CentOS 7.4 가 출시되면, annyung-release pacakge가 배포 되면서 공식적으로 AnNyung 3.2 (Aang) 배너로 변경하게 됩니다.

annyung-release-3.2 는 CentOS 7.4가 정식으로 출시되고, 한국 mirror에 sync가 되는 시점에 배포할 예정입니다.

참고할 사항으로는,

안녕 리눅스의 openssl 1.0.1e package들이 deprecated 되어 repository에서 제거 되었습니다. 안녕의 openssl은 HTTP/2 protocol 지원을 위하여
1.0.2의 ALPN 기능을 back porting 하여 제공하였으나, CentOS 7.4 부터 1.0.2k를 지원하므로 더이상 유지할 이유가 없어져 안녕 repository에서
제거가 되었습니다.

또한, 안녕의 openssl package는 CentOS의 package로 업데이트 되는 것을 방지하기 위하여, CentOS의 package보다 상위 버전처럼 하기 위하여 높>은 값의 epoch 버전을 가지고 있습니다. 그러므로 아무런 조치를 하지 않는다면 안녕의 1.0.1e는 CentOS 7.4를 설치하더라도 1.0.2k로 업데이트 >되지 않습니다.

이 문제를 해결하기 위하여, annyung-release-3.2 package에서 이를 보정하도록 되어 있고, CentOS 7.4가 한국 mirror 서버들에 동기화가 되었을>때, annyung-release-3.2를 배포할 예정이므로, CentOS 7.4로 업데이트가 되었다고 해도 annyung-release 3.2가 설치 되어 있지 않으면 여전히 op
enssl 1.0.1e 버전이 유지되오니 참고 하시기 바랍니다.

annyung-release 3.2가 설치 되기 전에, 또는 annyung-release package를 설치하기를 원치 않는 경우에는 다음 명령으로 1.0.2k 로 현시점에 바로
업데이트 할 수 있습니다.

rpm -q openssl | grep "\.an3" >& /dev/null
[ $? -eq 0 ] && yum downgrade "openssl*"

김정균

오늘 7.4 CR(Continuous Release) 버전이 release 되었네요. 조만간 7.4 가 출시될 것 같습니다. :-)

Posted
Filed under Tech/프로그래밍
0.70 release  소식 입니다.

iPuTTY 업데이트 사항:
  • fixed #27 wrong translattion
  • fixed #28 Fixedsys 폰트의 사용 on windows 10
  • fixed #30 add Hanterm key map
  • pscp의 기본 문자셋을 cp949에서 utf-8로 변경 (1e68e28)
PuTTY 업데이트 사항:
  • Security fix: the Windows PuTTY binaries should no longer be vulnerable to hijacking by specially named DLLs in the same directory, even a name we missed when we thought we'd fixed this in 0.69. See vuln-indirect-dll-hijack-3.
  • Windows PuTTY should be able to print again, after our DLL hijacking defences broke that functionality.
  • Windows PuTTY should be able to accept keyboard input outside the current code page, after our DLL hijacking defences broke that too.

릴리즈 패키지는 https://github.com/iPuTTY/iPuTTY/releases/tag/l0.70i 에서 제공 합니다.
2017/07/25 00:12 2017/07/25 00:12
Posted
Filed under Tech/Tip & Trick
Windows 10 사용중에 마우스만 움직이고 다른 기능은 다 멈추는 문제가 종종 발생했는데 찾아보니 "DynamicTick" 기술의 충돌 때문이라고 하네요. 자세한 건 하단의 "출처" 참고 하시고, 관리자 권한으로 cmd 실행해서

bcdedit /set disabledynamictick yes

실행한 후, rebooting 하시면 된다고 합니다.

출처: http://foxcg.com/246
2017/07/19 14:36 2017/07/19 14:36
Posted
Filed under Tech/프로그래밍
LePuTTY의 ZMODEM 기능을 iPuTTY에 포팅을 했습니다.

일단, 동작은 잘 하는 것 같네요. 좀 더 사용해 보고 문제가 없으면 0.69.1 로 릴리즈 할 예정 입니다. 그전에 PuTTY 0.70이 나오면 0.70으로 릴리즈 될 것이고요 :-)

https://github.com/iPuTTY/iPuTTY/pull/25

참고 하세요.
2017/06/12 03:40 2017/06/12 03:40
Posted
Filed under Tech/프로그래밍
어쩌다 보니 iPuTTY maintaing을 하게 되었습니다. 기존 관리자였던 김준기님이 작년에 project를 더이상 하지 않겠다고 project site에 공지를 올렸고, 비공식적으로 PuTTY 업데이트를 반영해서 사용하다가 그냥 제가 맡아서 하기로 하였습니다.

어쩌다 보니, 뒷처리 담당자로서 우뚝선 느낌입니다. :-)

어쨌든 4/29에 릴리즈된 PuTTY 0.69의 대응 버전을 릴리즈 했으며, 추가적으로 기능을 좀 더 강화 했습니다. 솔직히 GUI programing이 처음이고 PuTTY 코드를 제대로 본 것도 아니라서 잘 유지할 수 있을지 모르겠지만, 나서는 사람이 없어 일단 제가 총대를 매게 되었습니다. (아쉬운 사람이 해야 하는 관계로 T.T)

project 사이트는 bitbucket에서 GitHub로 이전을 했으며, https://github.com/iPuTTY/iPuTTY/wiki 를 이용하면 되겠습니다.

0.69 에서 제공하는 기능은 다음과 같습니다.

  • 한글 UI 제공
    • 다시 한글 UI를 제공 하며, pagent, puttygen, pscp, psftp 등 모든 프로그램에서 한글 UI를 제공 합니다.
  • 이제 64bit binary를 제공 합니다.
  • psftp 와 pscp 에서 UTF-8을 사용할 수 있습니다.
  • 한글 입력 모드에서 Esc를 누르면 자동으로 영문 입력 모드로 변경이 됩니다.
  • 서버 호스트키 체크 여부 옵션이 추가 되었습니다.
  • Cygterm backend 가 추가 되었습니다.
  • psftp 에서 ls 명령으로 개별 file 목록을 볼 수 없는 버그를 수정했습니다.

자세한 사항은 https://github.com/iPuTTY/iPuTTY/wiki 를 참고 하세요.
2017/05/17 01:34 2017/05/17 01:34
Posted
Filed under Tech/Tip & Trick
방금전, openvpn-gui 의 한글 번역이 review 를 통과 했습니다. 대충 번역만 해서 pull request를 날렸더니 까다롭게 하나하나 짚어 내는 군요.

그래서 좀 신경써서 테스트도 해 보고 해서 다시 제출을 하니 방금 approve가 되었습니다.

아마 다음 버전 릴리즈시에는 openvpn-gui 에서 한글을 보실 수 있을 겁니다. (단, 번역 품질은 ㅎㅎ)

https://github.com/OpenVPN/openvpn-gui/pull/155

사용자 삽입 이미지
사용자 삽입 이미지
2017/04/26 00:30 2017/04/26 00:30
Posted
Filed under Tech/Tip & Trick
금일 Xen Server 7.1로 업그레이드를 한 이 후에, oops.org VM 이 아래의 메시지를 뿌리면서 load가 되지 않는 문제가 있었습니다.

Failed Starting VM 'oops.org'

This operation cannot be performed because the specified virtual disk could not be found

정말 당황 스러웠습니다. 검색을 해 봐도 뾰족한 수는 없고, VM host에 로그인 해서 LVM partition을 봐도 제대로 인식은 되어 있었고..

oops.org는 기존에 Xen Server 7.0으로 운영을 하고 있었으며, Disk는 LVM으로 다음과 같이 사용을 하고 있었습니다.

Pysical disk:
  • /dev/sda   SSD 150G
  • /dev/sdb   SATA 500G

Logical disk:
  • oops.org
  • an2.pkg.oops.org
  • an2.x86.pkg.oops.org
  • test.oops.org

그런데, 다른 VM은 모두 load가 되는데, 하필 oops.org VM만 load가 되지 않는 것이었습니다. 특정 가상 disk를 인식을 할 수 없다는데, VM host에서 아무리 확인을 해 봐도 oops.org partition은 살아 있고, 실제로 다른 VM에 attach를 해서 확인을 해 봐도 잘 살아 있더군요.

2017년 1월 경에 장비 fault 나면서 복구 한지 이제 2달 정도 지났고, 정신 없이 지내다 보니 백업도 2017년 1월달 까지 밖에 없고, 좀 난감하더군요. 그래서 어쩔 수 없이 있는 파티션 날릴 각오를 하고 최후의 꽁수를 진행해 보았습니다.

  1. Detach oops.org virtual disk
  2. oops.org VM 제거
  3. oops.org VM 재생성
  4. Reattach oops.org virtual disk
  5. VM 재생성시에 생성된 가상 disk 제거
  6. boot 옵션을 Hard Disk로만 되도록 설정 변경
  7. rebooting

이 작업 이 후에, 다시 인식을 하여 oops.org VM load를 성공했습니다.

살짝 암담했었는데, 겨우 복구하고 한숨 한번 쉬어 주고, 이 글을 작성 합니다. --;
2017/03/29 04:24 2017/03/29 04:24
김정균

하.. 1년반이 지나서야 이 문제의 원인을 알았습니다.

아마 정말 virtaul disk 가 깨진 것이 아니라면 대부분 virtaal cdrom mount 를 한 상태에서 rebooting 을 했고, 부팅 시에 virtual cdrom을 eject 시킬 경우 이 문제가 발생을 합니다.

이 경우, XenCenter Console tab에서 DVD Drive를 xs-tools.iso (Xen 6) 또는 guest-tool.iso (Xen7) 로 선택한 후에 부팅을 하시면 됩니다. 그리고 OS가 부팅이 되어 있는 상태에서 eject 를 해 줘야 다음에 booting 이 정상적으로 진행이 됩니다.