강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

7. 커널 보안

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

7. 커널 보안

이것은 보안에 관련된 커널 조정 옵션들과 이 것들이 무엇을 하는 지에 대한 설명과 어떻게 사용하는 지에 대한 설명이다.

커널이 여러분 컴퓨터 네트워크 업무를 관리하므로, 커널을 매우 안전하도록 관리하는 것과 커널 자체의 보안이 깨지지 않도록 하는 것은 중요한 것이다. 최신 네트워킹 공격법의 일부를 방지하기 위해서는 커널의 버전을 최신의 것으로 관리해야 한다. 새로운 커널은 ftp://ftp.kernel.org/이나 디스트리뷰션 제작자의 사이트에서 찾을 수 있다.

또한 주로 쓰이는 리눅스 커널에 쓸 수 있도록 통일된 암호화 패치를 제공하는 국제 그룹도 있다. 이 패치는 (미국의) 수출 제한 조치 때문에 리눅스 커널에 끼워 넣을 수 없었던 여러 가지 암호화 서브시스템을 지원해 준다. 정보는 http://www.kerneli.org에서 구할 수 있다.

7.1 "2.0 커널"의 컴파일 옵션

2.0.x 커널에서는 다음의 옵션들을 쓸 수 있고, 커널 구성 단계 (Kernel Configuration Process)에서 볼 수가 있을 것이다. 아래에 설명되어 있는 대부분은 ./linux/Documentation/Configure.help 문서에 적혀 있고, 이 문서는 커널 컴파일 옵션을 실행할 때 make config 단계에서 도움말로 사용되고 있다.

  • 네트워크 방화벽 (CONFIG_FIREWALL)
  • 방화벽이나 마스커레이딩을 쓰려면 이 옵션은 켜져 있어야 한다. 만약 단순히 클라이언트로 컴퓨터를 사용하는 경우는 이 옵션을 끄는 것이 좋을 것이다.

  • IP: 포워딩/게이트웨이 (CONFIG_IP_FORWARD)

    만약 IP 포워딩을 사용한다면, 여러분의 리눅스 박스는 사실상으로 라우터의 역할을 하게 되는 것이다. 만약 사용하는 컴퓨터가 네트워크에 연결되어 있고 데이타를 어떤 네트워크에서 다른 네트워크로 포워딩 (Forwarding 전달)하는 경우라면, 애써서 세운 방화벽을 깨 버리는 결과를 만들 수가 있다. 보통의 다이알업 사용자는 이 기능을 꺼 버렸으면 할 것이지만, 다른 사용자들 은 이 상황에서 생기는 보안 문제의 발생에 주의를 기울일 필요가 생기게 된다. 반면에 방화벽 컴퓨터 자체는 이 기능을 켜서 사용하기를 바랄 것이고, 주로 사용하고 있는 방화벽 풀그림과 섞여서 사용되게 된다. [21. KLDP 문서]

    다음의 명령을 써서 다이내믹 IP 포워딩을 실행할 수 있고,

    다음의 명령으로 끌 수 있다.

    염두에 둘 것은 /proc안에 있는 파일은 가상의 버츄얼 파일이기 때문에, 파일의 실제 크기가 제대로 신고되지 않을 때가 있다.

  • IP: syn 쿠키 (CONFIG_SYN_COOKIES)

    SYN 공격은 모든 사용 가능한 자원을 소비하게 한다는 식의 방법으로, 결과적으로 리부팅을 하게 만드는, 서비스 거부 공격법 (DoS, Denial of Service)의 하나이다. 켜 놓지 않을 이유가 없는 옵션이다. 2.1 커널 시리즈에서는 이 옵션을 켜면 단순히 신 쿠키의 존재를 허용할 뿐, 사용을 허락하지는 않게 된다. 옵션을 켜기 위해서는 다음의 명령어를 쓴다.

  • IP: 방화벽 처리 (CONFIG_IP_FIREWALL)

    만약 여러분의 기계를 방화벽으로 사용하는 경우, 마스커레이딩을 사용하는 경우, 아니면 여러분의 다이얼-업 웍크스테이션에 누군가가 PPP 다이얼-업 인터페이스를 통해서 들어오는 것을 막기 위한 경우에 필요한 옵션이다.

  • IP: 방화벽 패켓의 일지 쓰기 (CONFIG_IP_FIREWALL_VERBOSE)

    이 옵션은 --발신인, 수신인, 포트 번호 등의-- 방화벽이 받은 패켓의 정보를 보여준다.

  • IP: 소스에서 라우트된 프레임 떨구기 (CONFIG_IP_NOSR)

    이 옵션은 켜져야 한다. 소스에서 라우트돼서 오는 프레임들은 (Source routed frames) 그 패켓 안에 목적지로 가는데 필요한 모든 진로(Path) 정보를 가지고 있고, 이러한 종류의 패켓을 라우터가 받게 되면 라우터는 내용을 검사하지 않고 무조건 통과 처리를 한다. 이러한 상황은 잠재적으로 침탈 수단이 되는 데이타가 여러분 시스템에 들어오는 것으로 발전될 수 있다.

  • IP: 마스커레이딩 (CONFIG_IP_MASQUERADE)

    여러분의 컴퓨터가 방화벽으로 사용되고 있고 이 방화벽이 보호하고 있는 네트워크 상의 어떤 컴퓨터가 네트워크 바깥의 호스트로 데이타를 보낼 때, 이 방화벽 컴퓨터는 이 호스트인 것처럼 "마스커레이드 (Masquerade, 가장)"하도록 할 수 있다. 보기를 들면, 마스커레이딩을 실행하는 컴퓨터가 데이타를 정해진 목적지로 주고 받으면서도 마치 이런 데이타가 방화벽 컴퓨터에서 발송되는 것인 척 꾸미게 되는 것이다. 이에 대한 정보는 http://www.indyramp.com/masq에서 구할 수 있다. [22. KLDP 문서]

  • IP: ICMP 마스커레이딩 (CONFIG_IP_MASQUERADE_ICMP)

    위의 마스커레이딩 옵션은 TCP나 UDP 정보의 경우만을 마스커레이딩 해준다. ICMP 마스커레이딩 옵션을 켜면 ICMP 마스커레이딩까지 덧붙여 하게 된다.

  • IP: 투명 프락시의 작동 (CONFIG_IP_TRANSPARENT_PROXY)

    이 옵션은 여러분의 리눅스 방화벽이 지역 호스트에서 발생되는 네트워크 트래픽과, 지역 호스트에서 외부의 원격 호스트로 보내어지는 네트워크 트래픽을 "트렌스페어런트 프락시 서버"라는 지역 서버로 (투명하게) 보내어 주게 한다. 이 옵션을 쓰면 지역 컴퓨터들을 , 사실상으로는 지역의 프락시로 연결이 되는 것이지만, 마치 외부의 리모트 컴퓨터로 연결이 되는 것처럼 생각하게 만든다. IP-마스커레이드 하우투와 http://www.indyramp.com/masq를 보면 더 자세한 정보를 얻을 수 있다.

  • IP: 데이타를 항상 뭉치로 전송 (CONFIG_IP_ALWAYS_DEFRAG)

    이 옵션은 보통 꺼져 있다. 하지만, 만약 여러분이 방화벽이나 마스커레이딩 호스트를 만든다면 이 옵션을 켜 놓는 것이 좋다. 데이타가 한 호스트에서 다른 호스트로 전송될 때, 데이타는 항상 한 뭉치로 보내어 지는 것이 아니라, 대개는 여러 조각으로 쪼개어져서 보내지게 된다. 쪼개어져서 보내어지는 경우의 문제점은 포트 번호가 제일 처음 보내어지는 조각에 만 적혀진다는 것이다. 이 것은 누군가가 나머지 데이타 조각들을 개조해서 그가 원하는 정보를 집어넣을 수가 있다는 뜻이 된다. 또한 이 옵션을 쓰면, 아직 티어드랍 공격에 대한 패치를 붙여 놓지 않은 내부 호스트를 쓸 때 티어드랍 공격이 실행되는 것을 방지할 수 있게 된다.

  • 패켓 사인 인증 (CONFIG_NCPFS_PACKET_SIGNING)

    이 것은 2.2.x 커널에서 사용할 수 있는 옵션으로, 보다 강한 보안을 위해서 NCP 패켓을 인증 (sign)할 때 사용된다. 보통은 이 옵션이 꺼져 있지만, 여러분이 필요하다면 쓸 수 있다는 것을 염두에 두시기 바란다.

  • IP: 방화벽 패켓 넷링크 디바이스 (CONFIG_IP_FIREWALL_NETLINK)

    사용자 공간 풀그림 (User-space program) 패켓의 첫 128 바이트를 분석해서 -- 이것의 합법성을 분석하는 방법으로 -- 패켓을 받거나 혹은 거부해야 하는 지를 결정하게 해주는 깔끔한 옵션이다.

    TOP.gif

"2.2 커널"의 컴파일 옵션

2.2.x 커널들은 옵션이 대부분 똑같지만, 새로운 옵션이 몇 가지 새로이 개발되어 있다. 아래에 설명되어 있는 대부분은 커널을 컴파일하는 중의 make config 단계에서 도움말 (Help facility)로 사용되는 /linux/Documentation/Configure.help 문서와 내용이 같다. [23] 새로 추가된 옵션들 만 아래에 적어 놓았다. 다른 필요한 옵션을 알고 싶으면 2.0 설명을 보기 바란다. 아마도 2.2 커널에서 가장 의미 있는 변화는 IP 방화벽 코드일 것이다. IP 방화벽을 설치하기 위해서 2.0 커널에서는 ipfwadm 풀그림이 사용되었지만, 2.2 커널에서는 ipchains 풀그림이 사용되고 있다.

  • 소켓 필터링 (CONFIG_FILTER)
  • 대부분의 사용자들에게는 이 옵션을 끄고 사용하는 것이 안전할 것이다. 이 옵션은 사용자 공간 필터를 소켓에 연결하는 것을 가능하게 해 주고, 패켓 통과가 허락되거나 거부되는 것을 결정하는데 사용한다. 하지만, 여러분이 상당히 독특한 필터를 쓸 필요가 있고 필터를 직접 프로그램 할 수 있는 능력이 있는 사람이 아니라면 이 옵션은 꺼 놓는 것이 좋다. 또한 한 가지 염두에 둘 일은 이 문서가 작성된 시점에서는 TCP를 제외한 모든 프로토콜이 지원된다는 것이다.

  • 포트 포워딩 (Forwording 전송 처리 傳送處理)

    포트 전송은 IP 마스커레이딩 등과 같이 바깥에서 방화벽 안의 포트들로 들어오는 패켓들을 전달 (Forword)한다. 예를 들어서, 방화벽의 뒤에서나 마스커레이드 하는 위에서 웹 서버를 운영하면서 이 웹 서버를 바깥에서도 접근 가능하게 허락하는 경우 등에 유용하다. 외부의 클라이언트가 방화벽의 80번 포트로 어떤 요청을 보내고, 방화벽은 이 요청 사항을 웹 서버로 전달하고, 그럼 웹 서버는 이 요청 사항을 처리한 후에 결과를 방화벽을 통해서 원래의 클라이언트에게로 다시 보내게 된다. 외부의 클라이언트에게는 마치 방화벽 자체가 웹 서버를 운영하고 있는 듯이 보이게 되는 것이다. 또한 방화벽 뒤에 동일한 모양과 기능의 웹 서버들을 많이 가지고 있다면 부하 조절 (Load Balanceing)을 하는 방법으로 쓰일 수도 있다. 이 기능에 대한 정보는 http://www.monmouth.demon.co.uk/ipsubs/portforwarding.html에서 구할 수 있다. 대략적인 정보는 ftp://ftp.compsoc.net/users/steve/ipportfw/linux21/를 보기 바란다.

  • 소켓의 여과 (CONFIG_FILTER)

    이 옵션을 써서 사용자 공간 (user-space) 풀그림들이 아무 소켓에다가 필터를 부착시킬 수 있게 되고, 결과적으로 커널이 어떤 종류의 데이타에 대해 소켓 통과를 허가하거나 불허하게 할 수 있게 된다. 리눅스 소켓 여과 (Linux Socket Filtering)는 현재 TCP를 제외한 모든 종류의 소켓에서 작동될 수 있다. ./linux/Documentation/networking/filter.txt를 읽어보기 바란다. [24. 레드 햇]

  • IP: 마스커레이딩 2.2 커널의 마스커레이드 기능은 특수한 프로토콜 등의 마스커레이드를 지원하는 등으로 개선되어져 있다. 보다 많은 정보를 원한다면 IPCHINS 하우투를 꼭 읽어보기 바란다.
TOP.gif

7.2 커널 디바이스들

리눅스에는 보안에 도움이 되는 몇 개의 블록 디바이스와 문자 디바이스가 있다.

/dev/random/dev/urandom의 두 디바이스는 랜덤 데이타를 언제라도 만들어 낼 수 있도록 커널에서 제공된다.

/dev/random/dev/urandom 둘은 보안상 안전한 (secure) 난수 발생 기능이 필수적인 PGP 열쇠의 제작, ssh 수하 도전용 (challenge), 그리고 기타 풀그림들 등에 사용될 수 있을 만큼 충분히 안전해야 한다. 공격자가 -- 이 두 기능에서 발생된 숫자들의 조합을 미리 알고 있다고 해서 -- 그 다음의 나올 숫자를 알아내는 일이 가능해서는 안된다. 이 둘로부터 생성되는 숫자들이 진정한 의미로서의 난수가 되도록 보장하는 많은 노력들이 쏟아 부어지고 있다.

두 디바이스의 차이점이라면 /dev/random은 무작위의 바이트들로 만들어지며, 무작위의 바이트들이 만들어 쌓이는 동안은 대기 상태가 된다는 정도일 것이다. 일부 시스템에서는 새로운 사용자 생성 입력 (user-generated entry)이 시스템에 등록되는 시간이 오래 걸릴 수 있고, 그 동안은 (사용이) 막혀 있을 수 있다는 것을 말하고 싶다. /dev/random을 쓰기 전에는 심사숙고하기를 바란다. (아마도 제일 좋은 방법은 형성이 되고 있는 사이에 -- "OK 충분합니다" 하는 메시지가 나올 때까지 -- 사용자들이 키보드를 두들기게 끔 하는 것일 것이다)

/dev/random은 -- 인터럽트 사이의 시간을 재서 만드는 등의 -- 질이 높은 엔트로피이다. 이것도 랜덤 데이타가 충분히 만들어질 때까지 막고 있게 된다.

/dev/urandom은 비슷하지만, -- 엔트로피가 낮을 때의 경우 -- 암호학 기법 상 강하다고 할 수 있는 헤쉬 값을 만들어 준다. 비록 이것은 (/dev/random으로 만들어지는 값에 비하면) 상대적으로는 덜 안전하지만, 대부분의 풀그림용으로는 충분하다.

다음과 같은 방법 등으로 디바이스로부터 읽어 낼 수 있다.

이것은 -- 패스워드를 만듦에 적절할 -- 8자의 난수를 콘솔로 출력할 것이다. mimencode는 메타 메일 패키지에서 볼 수 있을 것이다.

연산법에 대한 설명은 /usr/src/linux/drivers/char/random.c에 있다. 내가 (데이브) 이 것을 쓰는데 도와준 디어도어 와이 쭤, 존 루이스 그리고 리눅스 커널 팀 여러분에게 감사드린다.

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,076 명
  • 현재 강좌수 :  36,001 개
  • 현재 접속자 :  550 명