Kevin Fenzi, kevin@tummy.com
Dave Wreski, dave@nic.com
v1.1.0 2000년 3월 8일
장 범수, bschang@kldp.org
2000년 5월 9일
-----------------------------------------------------------------------------------
이 문서는 Linux System 관리자가 상대하게 되는 보안 이슈에 대한 일반적 개론을 밝힌다. 일반적인 보안 철학 등과 Linux System을 침입자로부터 보호할 방법 등의 특정 보기를 몇 가지 적어 놓았다. 보안에 관계된 자료들과 Program을 구할 수 있는 곳도 적어 놓았다. 개선 사항, 건설적인 비평, 첨가 사안, 그리고 수정안 등을 감사한 마음으로 수용하겠다. 여러분의 의견은 두 저자 모두에게 "Security HOWTO"를 Mail의 제목에 써서 보내 주기 바란다
-----------------------------------------------------------------------------------
7. Kernel 보안
이것은 보안에 관련된 Kernel 조정 Option들과 이 것들이 무엇을 하는 지에 대한 설명과 어떻게 사용하는 지에 대한 설명이다.
Kernel이 여러분 Computer Network 업무를 관리하므로, Kernel을 매우 안전하도록 관리하는 것과 Kernel 자체의 보안이 깨지지 않도록 하는 것은 중요한 것이다. 최신 Networking 공격법의 일부를 방지하기 위해서는 Kernel의 Version을 최신의 것으로 관리해야 한다. 새로운 Kernel은 여기나 Distribution 제작자의 Site에서 찾을 수 있다.
또한 주로 쓰이는 Linux Kernel에 쓸 수 있도록 통일된 암호화 Patch를 제공하는 국제 그룹도 있다. 이 Patch는 (미국의) 수출 제한 조치 때문에 Linux Kernel에 끼워 넣을 수 없었던 여러 가지 암호화 Subsystem을 지원해 준다. 정보는 여기에서 구할 수 있다.
7.1 "2.0 Kernel"의 Compile Option
2.0.x Kernel에서는 다음의 Option들을 쓸 수 있고, Kernel 구성 단계 (Kernel Configuration Process)에서 볼 수가 있을 것이다.
Network 방화벽 (CONFIG_FIREWALL)
방화벽이나 Masquerading을 쓰려면 이 Option은 켜져 있어야 한다. 만약 단순히 Client로 Computer를 사용하는 경우는 이 Option을 끄는 것이 좋을 것이다.
IP: Forwarding/Gateway (CONFIG_IP_FORWARD)
만약 IP Forwarding을 사용한다면, 여러분의 Linux Box는 사실상으로 Router의 역할을 하게 되는 것이다. 만약 사용하는 Computer가 Network에 연결되어 있고 Data를 어떤 Network에서 다른 Network로 Forwarding (Forwarding 전달)하는 경우라면, 애써서 세운 방화벽을 깨 버리는 결과를 만들 수가 있다. 보통의 Dial-Up 사용자는 이 기능을 꺼 버렸으면 할 것이지만, 다른 사용자들 은 이 상황에서 생기는 보안 문제의 발생에 주의를 기울일 필요가 생기게 된다. 반면에 방화벽 Computer 자체는 이 기능을 켜서 사용하기를 바랄 것이고, 주로 사용하고 있는 방화벽 Program과 섞여서 사용되게 된다. [21. KLDP 문서]
다음의 명령을 써서 Dynamic IP Forwarding을 실행할 수 있고,
root# echo 1 > /proc/sys/net/ipv4/ip_forward
다음의 명령으로 끌 수 있다.
root# echo 0 > /proc/sys/net/ipv4/ip_forward
염두에 둘 것은 /proc안에 있는 File은 가상의 Virtual File이기 때문에, File의 실제 크기가 제대로 신고되지 않을 때가 있다.
IP: syn Cookie (CONFIG_SYN_COOKIE)
SYN 공격은 모든 사용 가능한 자원을 소비하게 한다는 식의 방법으로, 결과적으로 Reboot을 하게 만드는, 서비스 거부 공격법 (DoS, Denial of Service)의 하나이다. 켜 놓지 않을 이유가 없는 Option이다. 2.1 Kernel Series에서는 이 Option을 켜면 단순히 신 Cookie의 존재를 허용할 뿐, 사용을 허락하지는 않게 된다. Option을 켜기 위해서는 다음의 명령어를 쓴다.
root# echo 1 > /proc/sys/net/ipv4/tcp_synCookie
IP: 방화벽 처리 (CONFIG_IP_FIREWALL)
만약 여러분의 기계를 방화벽으로 사용하는 경우, Masquerading을 사용하는 경우, 아니면 여러분의 Dial-Up Workstation에 누군가가 PPP Dial-Up Interface를 통해서 들어오는 것을 막기 위한 경우에 필요한 Option이다.
IP: 방화벽 Packet의 일지 쓰기 (CONFIG_IP_FIREWALL_VERBOSE)
이 Option은 --발신인, 수신인, Port 번호 등의-- 방화벽이 받은 Packet의 정보를 보여준다.
IP: Source에서 Route된 Frame 떨구기 (CONFIG_IP_NOSR)
이 Option은 켜져야 한다. Source에서 Route돼서 오는 Frame들은 (Source routed frames) 그 Packet 안에 목적지로 가는데 필요한 모든 진로(Path) 정보를 가지고 있고, 이러한 종류의 Packet을 Router가 받게 되면 Router는 내용을 검사하지 않고 무조건 통과 처리를 한다. 이러한 상황은 잠재적으로 침탈 수단이 되는 Data가 여러분 System에 들어오는 것으로 발전될 수 있다.
IP: Masquerading (CONFIG_IP_MASQUERADE)
여러분의 Computer가 방화벽으로 사용되고 있고 이 방화벽이 보호하고 있는 Network 상의 어떤 Computer가 Network 바깥의 Host로 Data를 보낼 때, 이 방화벽 Computer는 이 Host인 것처럼 " Masquerade(가장)"하도록 할 수 있다. 보기를 들면, Masquerading을 실행하는 Computer가 Data를 정해진 목적지로 주고 받으면서도 마치 이런 Data가 방화벽 Computer에서 발송되는 것인 척 꾸미게 되는 것이다. [22. KLDP 문서]
IP: ICMP Masquerading (CONFIG_IP_MASQUERADE_ICMP)
위의 Masquerading Option은 TCP나 UDP 정보의 경우만을 Masquerading 해준다. ICMP Masquerading Option을 켜면 ICMP Masquerading까지 덧붙여 하게 된다.
IP: 투명 Proxy의 작동 (CONFIG_IP_TRANSPARENT_PROXY)
이 Option은 여러분의 Linux 방화벽이 지역 Host에서 발생되는 Network Traffic과, 지역 Host에서 외부의 원격 Host로 보내어지는 Network Traffic을 "Transparent Proxy Server"라는 지역 Server로 (투명하게) 보내어 주게 한다. 이 Option을 쓰면 지역 Computer들을 , 사실상으로는 지역의 Proxy로 연결이 되는 것이지만, 마치 외부의 Remote Computer로 연결이 되는 것처럼 생각하게 만든다. IP-Masquerade HOW-TO 를 보면 더 자세한 정보를 얻을 수 있다.
IP: Data를 항상 뭉치로 전송 (CONFIG_IP_ALWAYS_DEFRAG)
이 Option은 보통 꺼져 있다. 하지만, 만약 여러분이 방화벽이나 Masquerading Host를 만든다면 이 Option을 켜 놓는 것이 좋다. Data가 한 Host에서 다른 Host로 전송될 때, Data는 항상 한 뭉치로 보내어 지는 것이 아니라, 대개는 여러 조각으로 쪼개어져서 보내지게 된다. 쪼개어져서 보내어지는 경우의 문제점은 Port 번호가 제일 처음 보내어지는 조각에만 적혀진다는 것이다. 이것은 누군가가 나머지 Data 조각들을 개조해서 그가 원하는 정보를 집어넣을 수가 있다는 뜻이 된다. 또한 이 Option을 쓰면, 아직 Tier Drop 공격에 대한 Patch를 붙여 놓지 않은 내부 Host를 쓸 때 Tier Drop 공격이 실행되는 것을 방지할 수 있게 된다.
Packet 사인 인증 (CONFIG_NCPFS_PACKET_SIGNING)
이것은 2.2.x Kernel에서 사용할 수 있는 Option으로, 보다 강한 보안을 위해서 NCP Packet을 인증 (sign)할 때 사용된다. 보통은 이 Option이 꺼져 있지만, 여러분이 필요하다면 쓸 수 있다는 것을 염두에 두시기 바란다.
IP: 방화벽 Packet 넷링크 Device (CONFIG_IP_FIREWALL_NETLINK)
사용자 공간 Program (User-space program) Packet의 첫 128 byte를 분석해서 -- 이것의 합법성을 분석하는 방법으로 -- Packet을 받거나 혹은 거부해야 하는 지를 결정하게 해주는 깔끔한 Option이다.
"2.2 Kernel"의 Compile Option
2.2.x Kernel들은 Option이 대부분 똑같지만, 새로운 Option이 몇 가지 새로이 개발되어 있다. 아래에 설명되어 있는 대부분은 Kernel을 Compile하는 중의 make config 단계에서 도움말 (Help facility)로 사용되는 /linux/Documentation/Configure.help 문서와 내용이 같다. [23] 새로 추가된 Option들 만 아래에 적어 놓았다. 다른 필요한 Option을 알고 싶으면 2.0 설명을 보기 바란다. 아마도 2.2 Kernel에서 가장 의미 있는 변화는 IP 방화벽 Code일 것이다. IP 방화벽을 설치하기 위해서 2.0 Kernel에서는 ipfwadm Program이 사용되었지만, 2.2 Kernel에서는 ipchains Program이 사용되고 있다.
Socket Filtering (CONFIG_FILTER)
대부분의 사용자들에게는 이 Option을 끄고 사용하는 것이 안전할 것이다. 이 Option은 사용자 공간 Filter를 Socket에 연결하는 것을 가능하게 해 주고, Packet 통과가 허락되거나 거부되는 것을 결정하는데 사용한다. 하지만, 여러분이 상당히 독특한 Filter를 쓸 필요가 있고 Filter를 직접 Program 할 수 있는 능력이 있는 사람이 아니라면 이 Option은 꺼 놓는 것이 좋다. 또한 한 가지 염두에 둘 일은 이 문서가 작성된 시점에서는 TCP를 제외한 모든 Protocol이 지원된다는 것이다.
Port Forwarding (Forwording 전송 처리 傳送處理)
Port 전송은 IP Masquerading 등과 같이 바깥에서 방화벽 안의 Port들로 들어오는 Packet들을 전달 (Forword)한다. 예를 들어서, 방화벽의 뒤에서나 Masquerade 하는 위에서 Web Server를 운영하면서 이 Web Server를 바깥에서도 접근 가능하게 허락하는 경우 등에 유용하다. 외부의 Client가 방화벽의 80번 Port로 어떤 요청을 보내고, 방화벽은 이 요청 사항을 Web Server로 전달하고, 그럼 Web Server는 이 요청 사항을 처리한 후에 결과를 방화벽을 통해서 원래의 Client에게로 다시 보내게 된다. 외부의 Client에게는 마치 방화벽 자체가 Web Server를 운영하고 있는 듯이 보이게 되는 것이다. 또한 방화벽 뒤에 동일한 모양과 기능의 Web Server들을 많이 가지고 있다면 부하 조절 (Load Balanceing)을 하는 방법으로 쓰일 수도 있다. 대략적인 정보는 여기를 보기 바란다.
Socket의 여과 (CONFIG_FILTER)
이 Option을 써서 사용자 공간 (user-space) Program들이 아무 Socket에다가 Filter를 부착시킬 수 있게 되고, 결과적으로 Kernel이 어떤 종류의 Data에 대해 Socket 통과를 허가하거나 불허하게 할 수 있게 된다. Linux Socket 여과 (Linux Socket Filtering)는 현재 TCP를 제외한 모든 종류의 Socket에서 작동될 수 있다. [24. 레드 햇]
IP: Masquerading 2.2 Kernel의 Masquerade 기능은 특수한 Protocol 등의 Masquerade를 지원하는 등으로 개선되어저 있다. 보다 많은 정보를 원한다면 IPCHINS HOW-TO를 꼭 읽어보기 바란다.
7.2 Kernel Device들
Linux에는 보안에 도움이 되는 몇 개의 Block Device와 문자 Device가 있다.
/dev/random과 /dev/urandom의 두 Device는 Random Data를 언제라도 만들어 낼 수 있도록 Kernel에서 제공된다.
/dev/random과 /dev/urandom 둘은 보안상 안전한 (secure) 난수 발생 기능이 필수적인 PGP 열쇠의 제작, ssh 수하 도전용 (challenge), 그리고 기타 Program들 등에 사용될 수 있을 만큼 충분히 안전해야 한다. 공격자가 -- 이 두 기능에서 발생된 숫자들의 조합을 미리 알고 있다고 해서 -- 그 다음의 나올 숫자를 알아내는 일이 가능해서는 안 된다. 이 둘로부터 생성되는 숫자들이 진정한 의미로서의 난수가 되도록 보장하는 많은 노력들이 쏟아 부어지고 있다.
두 Device의 차이점이라면 /dev/random은 무작위의 byte들로 만들어지며, 무작위의 byte들이 만들어 쌓이는 동안은 대기 상태가 된다는 정도일 것이다. 일부 System에서는 새로운 사용자 생성 입력 (user-generated entry)이 System에 등록되는 시간이 오래 걸릴 수 있고, 그 동안은 (사용이) 막혀 있을 수 있다는 것을 말하고 싶다. /dev/random을 쓰기 전에는 심사숙고하기를 바란다. (아마도 제일 좋은 방법은 형성이 되고 있는 사이에 -- "OK 충분합니다" 하는 메시지가 나올 때까지 -- 사용자들이 Keyboard를 두들기게 끔 하는 것일 것이다)
/dev/random은 -- Interrupt 사이의 시간을 재서 만드는 등의 -- 질이 높은 Entropy이다. 이것도 Random Data가 충분히 만들어질 때까지 막고 있게 된다.
/dev/urandom은 비슷하지만, -- Entropy가 낮을 때의 경우 -- 암호화 기법 상 강하다고 할 수 있는 Hash 값을 만들어 준다. 비록 이것은 (/dev/random으로 만들어지는 값에 비하면) 상대적으로는 덜 안전하지만, 대부분의 Program용으로는 충분하다.
다음과 같은 방법 등으로 Device로부터 읽어 낼 수 있다.
root# head -c 6 /dev/urandom | mimencode
이것은 -- Password를 만듦에 적절할 -- 8자의 난수를 Console로 출력할 것이다. mimencode는 Meta Mail Package에서 볼 수 있을 것이다.
연산법에 대한 설명은 /usr/src/linux/drivers/char/random.c에 있다. 내가 (Dave) 이 것을 쓰는데 도와준 디어도어 와이 쭤, 존 루이스 그리고 Linux Kernel 팀 여러분에게 감사드린다.
'Operating System > Linux' 카테고리의 다른 글
| Linux Security How-To (색인) (0) | 2007/06/18 |
|---|---|
| Linux Security How-To (보안 관련 자료) (0) | 2007/06/18 |
| Linux Security How-To (침입 도중이나 후에 할 일들) (0) | 2007/06/18 |
| Linux Security How-To (접속에 앞서서) (0) | 2007/06/18 |
| Linux Security How-To (Network Security) (0) | 2007/06/18 |
| Linux Security How-To (Kernel Security) (0) | 2007/06/18 |
| Linux Security How-To (Password Security & Encryption) (0) | 2007/06/16 |
| Linux Security How-To (File & File System Security) (0) | 2007/06/16 |
| Linux Security How-To (지역보안) (0) | 2007/06/16 |
| Linux Security How-To (물리적 보안) (0) | 2007/06/16 |
| Linux Security How-To (개요) (0) | 2007/06/16 |