2008년 10월 28일 화요일

how to patch

http://www.sysmng.com/linux/kldp/docs/security/docs/how2patch/how2patch.html 에서 흔적을 찾았다. 이 문서는 후배들과 같이 만들었던 동아리인 Security KAIST 시절의 문서이다. (http://www.sysmng.com/linux/kldp/docs/security/docs/ 에 있는 문서는 모두 Security KAIST 시절 멤버들이 만든 문서. 오 용케 인터넷 어딘가에 누군가가 보존해 주고 있었군.)

학부때 UNIX 중 Solaris 용으로 자동 패치점검 프로그램을 만들어서 배포했었다. 의외로 쓰는 사람들이 제법 있었다. SUN 유지보수 회사에서, 프로그램 업데이트 해주면 피자사준다고 하기도 (배포했던 README 에 무료로 마음껏 쓰시고 그놈 참 기특하다 싶을 땐 피자 한판 쏴주세요 라고 적었어서...) 토호호.

ACDC98 의 약어는 그 당시;;; 알 사람들은 알았는데. 98 은 그 당시 프로그램 제작년도 붙이는게 살짜쿵 유행 (Win98 따위;;; 쳇) 해서 붙인거고

ACDC 는 Ah! C8 Da Chattne 의 약자였다.;;;;;

ACDC98 은 혼자 만들었었고

나중에 A3 회사시절 99년도에 project 로 확대해서 paladin 군에게 알바를 주어 자동으로 patch 까지 먹여주는 버전으로 확대했었는데, 더 spec 을 늘린다거나 상용화 하지는 않았었다.

99년 까지 해서 저걸 만들었었는데, 사실 live server 에 patch 까지 자동으로 한다는건 무척 risky 한 일이어서 더 확대하지는 않고 필요한 patch file 을 다운로드 받아주는 것까지 paladin 군이 만들었었던 거로 기억된다.

국내에 PMS solution (패치관리솔루션)이 제품화 되어 보급되기 시작한 것은 그 후로 2~3년 뒤.

오. 나름 즐거웠던 기억. 앞서갔다는 기억.

이 문서는 Solaris 가 버전 업데이트 되면서 pkg install 체계로 바뀌면서 더 이상 유효하지는 않게 되었다.



Content

  • Solaris 에서의 Patch
  • HP-UX 에서의 Patch
  • ACDC98 소개
  • References

0. General Information

이 문서는 김휘강(sakai@major.kaist.ac.kr) 에 의해 만들어 졌습니다. 저자의 허가없이 무단으로 도용, 게제할 수 없습니다.

1. Solaris 에서의 Patch

1.0. What is the patch?

    ** patch : 헝겊조각 (깁는데 쓰는), 천조각, 판자조각, 덧대는 쇳조각 (수리용)

    사전적 의미에서도 바로 짐작할 수 있듯이 , OS 가 출시된뒤 OS 내부의 package 나 application program 또는 kernel 모듈에 버그가 발견된 경우 이를 바로잡기 위해 vendor 측에서 update 모듈을 내놓는데 이것이 바로 patch 이다.

    각각의 패치에는 고유한 Patch ID 가 부여되는데 xxxxxx-xx 와 같은 형태로 부여된다.

    앞의 6 자리는 ID serial number 이고 뒤의 두자리는 revision number 이다. 그러므로 같은 ID serial number를 가지고 있다하더라도, revision number 가 높을수록 최근에 나온 patch 임을 알 수 있다.

1.1. How to apply whole Patches?
  • http://sunsolve1.Sun.COM/pub-cgi/us/pubpatchpage.pl에서 공식적인 recommended patch 를 구할 수 있고, OS 별 PATCH Report 를 구할 수 있다.
    Recommended Patch 와 Security Patch 의 Patch Cluster 를 다운로드 받아서 한꺼번에 설치를 하고 난 후에는 security mailing list 에 가입하여 지속적으로 추가되는 패치사항에 대해서만 patch 를 적용하면 된다.

    Recommended Patch 를 설치하는 경우에는 OS_VERSION_Recommended.tar.Z 파일을 다운로드 한 후 다음과 같이 설치하면 된다.

    # zcat OS_VERSION_Recommended.tar.Z  tar xvf -
    # cd OS_VERSION_Recommended
    # installcluster .
    ......

    security patch 에 대해서만 patch 를 apply 하고 싶다면, "http://sunsolve1.sun.com/pub-cgi/secbul.pl 에서 security bulletin 을 읽고 자신의 OS 버전에 해당된 버그를 찾아 대응되는 패치를 적용하면 된다. 이 경우에는 install_patch 라는 스크립트를 쓰는데, 자신이 패치하려고 하는 패치의 Patch ID 가 무엇인지를 반드시 확인하도록 한다.

    예:

    다음과 같이 실행하여, 솔라리스 패치를 적용시킨다.

    예를 들어 major 란 호스트에서 Patch ID 가 103817-03 인 패치를 설치해야 하는 경우라고 하면,

    우선 자신의 호스트에 103817-03 패치가 기존에 설치되어 있는지를 확인하도록 한다. 이는 /usr/bin/showrev 커맨드를 사용하여 손쉽게 확인할 수 있다.

    # showrev -p grep 103817-03
    Patch: 103817-03 Obsoletes: Packages: SUNWcsu
    #

    위와같은 출력결과가 나왔다면 이미 설치가 된 경우이고 아무것도 출력결과가 없다면 설치가 되지 않은 경우이다.

    설치가 되지 않았다면 ftp://sunsolve1.sun.com/pub/patches/103817-03.tar.Z 에서 파일을 받아온 후, 다음과 같이 설치하도록 한다.

    major# ./installpatch .
    Checking installed packages and patches...
    Generating list of files to be patched...
    Verifying sufficient filesystem capacity (exhaustive method)... Installing patch packages...
    Patch number 103817-03 has been successfully installed.
    See /var/sadm/patch/103817-03/log for details
    Patch packages installed:
    SUNWcsu
    major#

    패치가 설치된 후에 에러메시지나 결과 log 는 /var/sadm/patch/ 디렉토리 밑에 PATCH_ID 의 디렉토리 아래에 log 파일로 저장이 되게 된다. 다음에 다루겠지만, 패치를 uninstall 하고 싶은 경우에는 /var/sadm/patch/PATCH_ID/ 디렉토리에 있는 backoutpatch 스크립트를 사용하면 된다.

    시스템에 여유공간이 별로 없는 경우라면 /var/sadm/patch 디렉토리를 삭제해도 무방하다. showrev -p 에서 읽어들이는 정보는 /var/sadm/pkg/ 디렉토리에 기록되어 있는 package information 이므로 현재 시스템에 설치되어 있는 patch 정보를 알아내는 데에는 영향을 주지 않으므로 /var/sadm/patch를 삭제해도 문제없다.

1.2. How to back out patches?

    backout을 하는 경우는 패치를 설치한 후 시스템이 비정상적으로 작동하는 경우나, OS 버전에 맞지 않는 잘못된 패치를 설치한 경우 (이런 경우는 거의 드물다. 대개 설치시 installpatch script에서 error handling을 해준다.), 또는 패치를 설치할 때 에러가 발생한 경우, 설치한 패치를 제거하고 싶을 때이다.

    이때에는 /var/sadm/patch/PATCH_ID/backoutpatch 스크립트를 실행시키면 된다.

    # backoutpatch PATCH_ID

    와 같은 형태로 명령을 수행해 주면 안전하게 패치가 uninstall 된다.

    아래의 Exit Code 는 backoutpatch를 수행할 때 발생할 수 있는 Exit Code 를 나열한 것이다.

    # Exit Codes:
    # 0 No error
    # 1 Usage error
    # 2 Attempt to backout a patch that hasn't been applied # 3 Effective UID is not root
    # 4 No saved files to restore
    # 5 pkgrm failed
    # 6 Attempt to back out an obsoleted patch
    # 7 Attempt to restore CPIO archived files failed
    # 8 Invalid patch id format
    # 9 Prebackout script failed
    # 10 Postbackout script failed
    # 11 Suspended due to administrative defaults
    # 12 Backoutpatch could not locate the backout data
    # 13 The relative directory supplied can't be found
    # 14 Installpatch has been interrupted, re-invoke installpatch
    # 15 This patch is required by a patch already installed, can't back it out


    아래는 major 란 호스트에서 Patch ID 가 103817-03 인 패치를 제거(back out) 하는 예이다.

    major# ./backoutpatch 103817-03
    Checking installed packages and patches...
    Patch 103817-03 has been backed out.
    major# showrev -p grep 103817
    Patch: 103817-01 Obsoletes: Packages: SUNWcsu
    Patch: 103817-02 Obsoletes: Packages: SUNWcsu


1.3 참고사항 (중요)
  • 패치를 적용할 때 , required 패치가 설치할 패치 이전에 설치되어 있어야 한다. 참고로 Solaris 2.5.1 머쉰에서 사전에 필요한 패치를 하지 않고 패치를 실행시켰을 때의 예이다.
    Solaris2.5.1_machine# ./installpatch .
    Checking installed packages and patches...
    ERROR: This patch requires the following patches
    which have not been applied to the system:
    103566-36 106663-01 106662-01 103901-11
    Installpatch is terminating. 이 예에서는 103666-36.tar.Z , 106663-01.tar.Z , 106662-01.tar.Z , 103901-11.tar.Z 를 pre-required
    patch 로 설치를 사전에 해두어야 한다.
  • 패치를 설치할 경우나 backout 시킬 때에는 single user mode 로 로긴하여 패치를 하는 것이 원칙이다. 하지만 이것이 여의치 않을 경우 (가령, 24 시간 Full Service 를 하고 있는 시스템인 경우) 에는 가급적 시스템이 조용한 상태에서 , 즉 사용자가 뜸한 시간이라든가 작동되고 있는 프로세스 수가 적은 시간 대를 이용해서 패치를 하는 것이 바람직하다.
  • 패치를 설치한 후에는 리부팅을 시켜야 한다. 간단히 application 프로그램의 바이너리 파일만 패치하는 경우가 아닌 커널모듈이나 데몬을 패치하는 경우라면 가급적 리부팅을 시켜주도록 한다.

2. HP-UX 에서의 PATCH

2.1. How to apply whole Patches?
  • 아래의 사이트에서 패치를 구하도록 한다. 자신이 어떤 항목에 관련된 패치를 적용할 것인지 미리 키워드를 알고 있는 것이 좋다. 아직 아래의 사이트에서는 OS 별 , 패키지별 패치항목을 표로 정리해서 보여주고 있지 않다.
  • 원하는 패치를 받아왔으면 간단하게 sh을 이용하여 압축을 풀도록 한다. 압축을 풀고나면 패치에 대한 간략한 설명이 포함되어 있는 PATCH_ID.text 파일과 PATCH_ID.depot 파일이 생성되게 된다. 이 파일들을 swinstall을 이용해서 설치해 주기만 하면 된다. X windows 환경이나 CDE 환경 하에서는 GUI 로 swinstall 이 작동되며, 그렇지 않은 경우에는 text 모드로 작동되게 된다.
  • 아래는 PHCO_8246 이라는 팻치를 설치하는 예제이다.

    # sh PHCO_8246
    PHCO_8246.text PHCO_8246.depot
    # swinstall -s $PWD/PHCO_8246.depot

    swinstall에서 패치가 기존에 설치되어 있는지, 또는 시스템에 맞는 패치인지를 알아서 점검해 주므로 상당히 편리하다.

2.2 참고사항 (중요)

    PATCH_ID.depot 파일 내에 Automatic Reboot? 항목이 yes 인지 no 인지 사전에 반드시 확인해야 한다. Automatic Reboot 이 yes 로 되어 있는 경우 패치를 설치함과 동시에 시스템이 rebooting 되기 때문이다.

3. ACDC98 소개

  • 보안에 관련되서 한달에 한두 개 정도는 새로운 버그가 지적이 되고 이를 해결해주는 패치역시 1~2 개 정도는 꼬박꼬박 나오게 마련인데, 시스템 관리를 하면서 자기가 관리하고 있는 시스템이 어떤 것이 패치가 되어 있는지, 또 어떤 것이 패치가 되어 있지 않은지 일일이 점검해 보기는 보통 시간을 많이 잡아먹는 일이 아니다. 이를 위해 Solaris 2.x에서 Security 관련 패치에 대해 패치상황을 점검해 주고 , 필요한 패치를 다운로드 받도록 지시해 주는 간단한 프로그램이다.

    이 프로그램에서 점검해 주는 항목들은 다음과 같다. 이 프로그램 내에서는 98/11/14 일까지 발표된 security 상의 문제점을 점검하고 그에 대한 패치가 설치되어 있는가를 점검한다. 프로그램에서 체크해 주는 항목들은 꾸준히 업데이트 될 예정이다.

    OS Version

    check list

    Solaris 2.3

    Solaris_2.3.txt

    Solaris 2.4

    Solaris_2.4.txt

    Solaris 2.5

    Solaris_2.5.txt

    Solaris 2.5.1

    Solaris_2.5.1.txt

    Solaris 2.6

    Solaris_2.6.txt

  • 설치 및 실행

    이 프로그램은 다음의 사이트에서 구할 수 있다.

    http://mgt.kaist.ac.kr/~sakai/DOWNLOAD/ACDC98.tar.gz

    다운로드 받은 프로그램을 다음과 같이 설치한 뒤 실행하면 된다.

# gzip -dc acdc98.tar.gz tar xvf -
# make all
# ./acdc

  • result report

성공적으로 버그에 대한 검색이 끝났다면 results.html 이 생성되었을 것이다.
시스템 내의 WWW browser 를 이용해서 보면 된다.

    다음은 captain.kaist.ac.kr 에서의 실행 예이다.

  • 장점

    이 프로그램의 장점은 알고리즘이 단순하기 때문에 빠르고 시스템에 부하를 거의 주지 않는다. 또 관리자에게 도움이 될 만한 문서를 많이 제공해 주고 있다.

4. References