제 4회 리눅스 공동체 세미나 D-2 세션 강의록

중고생을 위한 리눅스 강의

최승국

서강대학교 정보통신원 네트웍실

(prometheus@slug.sogang.ac.kr)

==============================================

차례

1. 들어가면서

2. 다양한 리눅스 배포판에 대한 나의 생각들...

3. 리눅스로 무엇을 할 수 있는가?

4. 리눅스에서 게임이란?

5. 리눅스에서의 보안 그 중요성에 대하여.

6. 후기.

===============================================

1. 들어가면서

3년전 누군가가 제게 물었던 질문하나. 리눅스가 뭐예요? 그래서 남들이 얘기하듯이 그냥 윈도우즈에 대항하는 OS라는 짧은 답변만을 해주고 말았던 기억이 생각납니다. 과연 리눅스가 윈도우에 대항하는 차세대 OS일까요? 그 답은 차세대 리눅스의 시대를 열어갈 여러분 모두의 노력에 달려 있다고 생각합니다.

여러분들이 리눅스를 열심히 배우고 익힌 후 보다 유익한 프로그램을 개발하거나 리눅스를 질적으로 발전시킨다면 분명히 리눅스는 지금의 윈도우를 능가하는 훌륭한 OS가 될 수 있을 것입니다.(물론, 지금도 많은 부분에 있어서 MS보다 월등히 발전되어 있는게 사실이지만.)

그 반대의 경우라면 리눅스는 한낱 한 시대를 풍미했던 OS로만 역사에 이름을 남길 것입니다. 여러분들에게 한국 리눅스의 미래가 달려 있습니다. 그런 여러분들을 만나게 되어서 너무나 기쁩니다.

이번 강의는(왠지 어색하군요, 강의라는 단어가) 그냥 제가 처음 리눅스를 어떻게 알게 되었는지 그리고 리눅스가 무엇인지, 리눅스로 무엇을 할 수 있는지를 편안하게 이야기할까 합니다. 지루하게 느껴지는 부분이 있다면 죄송. ^.^!

제가 리눅스를 접한건 96년 봄 이었습니다. 그때는 슬랙웨어라는 리눅스가 이름을 날리던 때였지요. 설치를 수십번 했던 기억이 생각이 납니다.(지금의 설치는 누워서 떡 먹기가 되었지만.) 그리고 콘솔에서 바라보던 막막하기만 하던 그때를 생각만 하면 아찔하기도 하고 또한 웃음이 절로 나기도 합니다.

그때에 제가 수십번의 설치와 제거를 반복하면서도 리눅스를 알고 싶었던 이유는 리눅스에

대해 듣고 처음 본 어느 책에 있었던 GNU 선언문이라는 이름의 글이었습니다.

GNU 선언문 중 일부.

[어떤 프로그램을 좋아한다면 당연히 그것을 좋아하는 사람들과 함께 나누는 것이 황금률(대우받고자 하는 데로 대하라-성서)이라고 생각한다. 소프트웨어를 판매하는 사람들은 사용자를 각각 구분하고, 그들 위에 군림하고, 사용자 서로가 프로그램을 공유하는 것을 막고자 한다. 나는 이런 식으로 사용자간의 결속이 깨지는 것을 거부한다. 나는 올바른 양심으로 비공개 협정이나 소프트웨어 라이센스 협약에 서명할 수 없다. 여러 해 동안 인공지능 연구소에서 일하면서 그러한 경향과 다른 박정한 일들에 저항해 보았지만 결국에는 그들의 승리로 끝나고 말았다. 내 의지에 역행하는 그런 일들이 일어나는 연구소에 나는 더이상 머무를 수가 없었다.

내가 계속해서 명예를 손상시키지 않고 컴퓨터를 사용하기 위해서 나는 사용이 제한되는 소프트웨어들을 더이상 이용하지 않고도 작업을 해 나갈 수 있는 충분한 자유 소프트웨어의 본체를 만들 결심을 했다. 나는 MIT(Massachusetts Institute of Technology) 측이 어떠한 법률적 근거에 의해서도 GNU의 자유로운 배포를 제지하지 못하도록 하기 위해서 연구소를 그만두었다.]

위의 내용은 리차드 스톨만 교수님께서 자유소프웨어 재단을 만들 것을 결심하면서 쓴 GNU 선언문중의 일부입니다. 전 여러분들에게 지금 이 시간 리눅스의 기능적인 측면을 말씀드리고 싶지 않습니다. 또한 그것을 열심히 알려 드리고 싶지도 않습니다. 전 여러분이 오늘 하나만 가지고 가도 성공 했다고 생각합니다. 그것이 바로 GNU와 GPL입니다.

나눔과 공유의 정신 그리고 더불어 함께 하고자 하는 정말 순결한 GNU의 정신을 말입니다. 이 정신이 오늘의 제가 그리고 많은 리눅서들이 리눅스를 하게끔 만들었던 철학이자 사상이며 힘이라고 생각합니다. 여러분들도 리눅스를 알고 있다면 GNU와 GPL을 가슴속에 깊이 간직하시기를 바랍니다. 그리하여 훗날, 리눅스를 통한 사회에의 봉사와 헌신이라는 이름앞에 여러분 모두의 이름들이 오르기를 오늘 전 간절히 바랍니다. 이것이 오늘 제가 강의 하고자 하는 내용중의 가장 큰 핵심내용 입니다.

아는것도 없고 별로 잘나지도 못한 부끄러운 저이지만 새로운 세기, 리눅스의 주역이 되실 여러분들에게 한가지만 당부를 드리고 싶습니다. 실력있는 한 사람의 기술자가 되기보다는 부족하더라도 겸양을 갖춘 한 인간이 되시기를 바랍니다.

자신이 아무리 실력이 뛰어나도 그 실력을 자랑하거나 과시하는 모습이 아닌 겸손한 모습으로 자신을 낮추고 최선의 노력을 다할줄 아는 철학을 가진,진실을 간직한 리눅서가 되시기를 진심으로 부탁드립니다. 그 모습이 진정한 GNU의 정신이 아닌가 생각합니다. 꼭,꼭 기억해 주시기 바랍니다. 리눅스는 철학을 가진 OS라는 것을. 혼자만의 것이 아닌 더불어 함께하는 모습이 리눅스의 본질임을.

2. 다양한 리눅스 배포판에 대한 나의 생각들...

리눅스는 핀란드의 대학생이던 리누즈 토발즈에 의해서 1991년 최초로 세상에 모습을 드러 냈습니다. 그 이후 수많은 사람들의 자발적 참여와 헌신에 의하여 현재 우리가 사용하고있는 리눅스로서 발전을 할 수 있었습니다. 이는 자유소프트웨어 진영의 성과물중 하나라고 할 수 있을 것입니다.

최근 국내에도 리눅스의 열풍을 통하여 많은 이들이 리눅스를 접하고 리눅스를 사용하고 있습니다. 허나, 무수히 많은 배포판이 난립하는 가운데 사용자들에게 선택의 자유를 준 만큼 혼란을 준 것 또한 사실입니다. 현재 나와있는 배포판의 종류는 그 수를 헤아릴수 없을 정도로 많이 있습니다. 다른 나라의 경우에는 레드햇 리눅스,칼데라 오픈 리눅스,SUSE 리눅스,터보 리눅스,데비안,슬랙웨어,코렐리눅스 등이 있으며, 국내의 경우는 레드햇 기반의 배포본으로 미지리눅스,알짜리눅스,파워리눅스,엑셀리눅스,K리눅스,큐리눅스,엘릭스 리눅스 등이 있습니다. 그리고 비 레드햇 계열로는 대표적인 오픈리눅스 한글판, 한글 슬랙웨어,데비안 등의 리눅스 배포본이 존재하고 있습니다.

많은 이들이 배포판의 종류가 다양함으로 인하여 발생하는 혼란에 대하여 말씀하시는 경우가 있는데 이는 시장의 원리에 의하여 향후 2년내에 몇 개의 배포본만이 살아남는 형식으로 재편되지 않을까 생각합니다. 즉, 사용자에 의하여 배포판들의 미래가 결정지워 지리라 생각합니다. 그러하기에 큰 문제는 아니라고 생각합니다.

그리고 중요한 사실이 하나 있습니다. 유닉스의 종류가 다양하듯이 리눅스의 종류 또한 위에서 나열한 것 이상으로 다양합니다. 유닉스는 각 벤더들의 제품에 따라서 천차만별이고 사용자 인터페이스 또한 상당한 괴리가 있으나 리눅스는 현재의 유닉스와는 다르게 결론은 하나라는 것입니다. 즉, 토발즈가 만들어낸 리눅스의 커널을 모든 배포판들이 사용하고 있기 때문입니다. 그것이 바로 리눅스의 종류가 다양해도 리눅스는 하나라는 얘기의 논거이며 이것이 바로 리눅스가 유닉스와 구별되는 이유입니다.

자 그럼 말장난은 그만하고 본격적으로 리눅스를 활용하는 것에 대해서 얘기할까 합니다.

3. 리눅스로 무엇을 할 수 있는가?

사람들은 리눅스를 서버용 OS로만 생각을 하는 경우가 많이 있다. 그렇다. 리눅스는 개발부터가 유즈넷이라는 네트웍을 통해서 만들어진 것이기 때문에 네트웍과 서버에 강하다. 그것도 아주 강력하다. 현존하는 거의 모든 서버 기능을 리눅스박스 한 대만으로도 구현이 가능하기 때문이다. 허나, 최근 들어서 리눅스용 어플리케이션의 개발과 기존 윈도우즈용 프로그램들의 리눅스 포팅은 결코 리눅스가 서버용 OS만으로 존재하는 것을 허락하지 않는게 사실이다.

다시말하면 윈도우즈에서 할 수 있는 대부분의 작업들을 리눅스에서도 사용할 수 있다는 것이다.

첫 번째로, 그 대표적인 것이 오피스 제품군이라고 할 수 있을 것이다. 현재 리눅스용으로 만들어진 오피스 제품군으로는 얼마전 썬에서 인수한 스타오피스를 들수 있을 것이다. 그리고 터보리눅스에서 제공되어지고 있는 Applixware라는 제품이 있다. 또한 코렐리눅스에 포함되어 있는 워드퍼펙을 비롯한 오피스 제품군이 있다. 물론, 한글화라는 명제가 남아 있기는 하지만 기존 MS-OFFICE에 버금가는 기능과 성능은 사무환경에도 적합한 OS로서 리눅스가 자리매김할 수 있는 좋은 계기를 만들었다고 할 수 있다.

두 번째로, 전세계에서 유일하게 MS-WORD를 물리친 워드프로세서인 □글이 리눅스용으로 존재한다는 사실이다. 데이터의 호환과 사용자 인테페이스가 윈도우즈용 □글과 동일하기에 사용함에 불편함이 전혀 없다.

세 번째로, 홈페이지 제작과 관련하여 가장 많이 사용하는 그래픽 프로그램을 말하자면 리눅스에서는 GIMP라는 프로그램이 있다.그리고 그외에 GQVIEW,ELECTRIC EYES, XPAINT등의 다양한 그래픽 뷰어와 프로그램이 있다. 포토샵을 살려면 금액만도 장난이 아니지만 위의 프로그램들은 무료이다. 그러함에도 뛰어난 기능을 가지고 있는 그래픽 프로그램들이다. 물론, 현재 Adobe의 그래픽 프로그램들도 리눅스로 포팅중이라고 함.

네 번째로, 인터넷과 PC통신을 할 수 있는 프로그램으로는 가우와 세연,미니컴 등의 다양한 공개 프로그램들이 있다. 이 부분은 나중에 설명하도록 하겠다.

다섯 번째로, 리눅스에서 과연 할 수 있는 게임이 있을까? 라는 질문에 대한 답을 하고자 한다. 많은 사람들이 컴퓨터에 입문하는 순서는 대개가 게임을 통해서 일 것이다. 그런데 리눅스를 사용하고 싶어도 할 수 있는 게임이 없어서 리눅스에 매력을 느끼지 못한다는 사람들이 많이 있다. 천만의 말씀이다.!!! 할 수 있는 게임이 사방에 널려있다. 이것은 아래에서 다시 자세히 다루도록 하겠다.

여섯 번째로, 최근에 많이 사용하는 MP3 재생용 프로그램으로는 XMMS 가 있으며 AVI,MOV 파일등의 동화상 재생에는 XANIM 이라는 프로그램을 사용하면 윈도우용 프로그램에 못지않은 효과를 느낄수 있을 것이다.

일곱 번째로, 리눅스의 가장 핵심적인 용도라고 할 수 있는 다양한 서버용으로 활용이 가능하다는 것이다. 이것은 윈도우즈 계열에서는 상상하기 힘든 것이라고 할 수 있다. 즉, 웹서버,삼바,방화벽,화일서버,ftp,news,nis,nfs등 리눅스를 통한 서버활용은 그 범위가 엄청나다고 할 수 있을 것이다. 이러한 것을 윈도우즈에서 하기 위해서는 장난이 아닐것이다.

하드웨어 스팩이나, 자금부분에서.....

이외에도 자세히는 다루지 못하지만 QCAD,MC,리눅스에는 엄청나게 많은 보물같은 프로그램들이 무료로 제공되어지고 있다. 윈도우즈용 프로그램이라면 우리의 가벼운 주머니를 다 털어가 버렸을텐데.

자! 이래도 리눅스가 서버용 OS 인가?

서버용뿐만 아니라 클라이언트용으로 리눅스는 확고한 위치를 잡아 나가고 있다고 필자는 생각한다. 또한 그것을 느끼고 싶다면 여러분은 리눅스의 세계에 뛰어들면 되는 것이다.

4. 리눅스에서 게임이란?

앞에서도 잠시 언급을 하였지만 대부분의 게임들은 윈도우용으로 포팅이 된후 여타 OS로 대한 막연한 어려움이나 리눅스가 윈도우에 월등히 앞서는 기술이나 프로그램에 대해서는 추가적으로 다루도록 하겠다.

*리눅스에서의 게임 활용방법

솔직히 리눅스에서 오락을 한다는 것은 윈도우용으로 개발된 모든 오락을 사용할 수 있다는 것은 아니다. 리눅스용으로 포팅이 되어진 경우나 시스템의 성능이 빵빵 하다면 사용할 수 있는 wine을 이용하여 윈도우용 게임을 사용할 수 있다. 다시말해서 리눅스에서도 못하는 게임은 없다는 것이다.

리눅스용으로 포팅이 된 게임으로는 많은 것들이 있으나 대표적인 것들을 몇가지 얘기하겠다. 둠, 퀘이크1, 2, 3, 언리얼 토너먼트, 레일로드 타이푼, 문명 콜 투 파워,  미스 2, 울티메이트 솔리테어, 히어로즈 오브 마이트 앤 매직 III, 울티마 온라인등의 게임이 리눅스용 게임이라고 할 수 있다.

여기서는 리눅스에서 wine을 이용하여 게임을 할 수 있는 방법을 얘기하기로 하겠다.

wine은 wine is not an emula or의 약자로서 윈도우용 api를 새롭게 만든 것이다. 다시말해서 윈도우에서 리눅스를 돌리기 위해서 사용하는 vmware의 경우 에뮬레이터이지만 wine의 경우는 에뮬레이터가 아니다. 기본적으로 wine을 사용하기 위해서는 자신의 시스템 사양을 체크해야 한다. CPU-펜Ⅱ266MHz , 메모리 128M 이상의 하드웨어적인 사양이어야 WINE을 사용하는데 문제가 없을 것이다.

허나, 솔직한 얘기는 아직까지 wine 프로젝트는 진행이 되고 있는 것이기에 많은 부분에서 문제점이 있으며 불안정한 것이 사실이다. 이는 가까운 장래에 극복이 되어지리라고 생각되어진다.

그러면 wine을 컴파일하는 것부터 설명하기로 하겠다. 리눅스에서는 기본으로 제공되어지는 패키지안에 포함되어 있지 않은 프로그램의 경우 해당 프로그램을 ftp로 다운 받은후 컴파일을 한후에 실행할 때 사용할 수 있다. 여기에서 컴파일에 대해서 의문이 나시는 분들은  kldp.org에 방문하셔서 자료를 참조하시거나 시중에 나와있는 책을 보시기를 바란다. 컴파일은 컴파일 하나만으로도 많은 시간이 소요되는 내용이며 기본적인 리눅스에 대한 지식이 필요하기에 이번 강좌에서는 생략하도록 하겠다.

현재 국내 시장의 절대 다수를 석권하고 있는 배포판이 레드햇 계열이다. 하여 레드햇을 중심으로 설명을 하도록 하겠다.

먼저, 소스를 다운받는다.

ftp://orcus.progsoc.uts.edu.au/Wine/development/Wine-200000230.tar.gz

에 접속하여 다운을 받는다. 그리고 별도의 디렉토리를 만들어서 복사한후에 압축을 푼다.

#gzip -cd Wine-200000230.tar.gz | tar xvf

#./configure

#make

#make install

이렇게 하면 일단 컴파일은 끝났다.

컴파일이 끝난 후에,

# cd /usr/local/etc - rpm 패키지를 설치할 경우 이와같은 경로에 wine.conf 파일이 생성되며,

# cd /etc/wine - 소스를 설치했을 경우는 이와같은 경로에 wine.conf 파일이 생성되어진다.

그다음 작업할 것은

# pico /etc/wine/wine.conf를 실행하여 편집을 한다.

내용에 들어있는 것중 앞의 부분은 넘어가고 아래의 부분을 수정해야 한다.

[Drive C]

Path=/mnt/win

......

다른 부분은 손댈 필요가 없고 path항목에서 윈도우가 마운트되는 경로를 적어주면 된다.

[Drive D]

Path=/mnt/cdrom

......

이부분도 path만 제대로 지정주면 된다. 이외의 설정 파일은 큰 문제가 없는 한 디폴트로 하면 된다. 간단하지만 이렇게 해서 wine을 설치하는 것에 대해서 이야기를 했다.

wine을 통하여 윈도우용 게임을 돌리고자 한다면 대부분의 게임은 X Windows상에서 사용가능할 것이다. 스타크레프트나 타이베리안 썬과 같은 종류의 것들은 말이다. 한가지 주의할 것은 X 서버의 주파수와 해상도를 640*480, 256 이상으로 설정을 해야만 사용하는데 문제가 없음을 유념하기 바란다. 이제 모든 작업은 끝이 났다.

그럼, 다음으로 어떻게 게임을 실행하고 해 볼것인가?

위의 그림은 우리에게 너무나 익숙한 스타의 저그족과 프로토스종족이다. 스타를 실행하기 위해서는 X Windows에서 스타크레프트가 설치되어 있는 디렉토리로 가서

#wine starcraft.exe를 실행하면 된다.

마찬가지로 에이지오브엠파이어를 사용하고자 원한다면 wine을 설치한 후에 설정화일을 확인하여 wine age.exe 파일을 실행하면된다.

이렇게 간단하지만 wine을 이용하여 윈도우용 게임을 사용하는 방법을 배웠다. 이외에도 VMware를 이용하여 윈도우용 게임을 이용할 수도 있다. VMware는 리눅스 머신에서 윈도우용 프로그램을 에뮬레이터 해주는 프로그램으로 웬만한 윈도우용 게임을 이용할 수 있다.

허나, 이 역시 시스템의 특성과 사양에 영향을 많이 받고 있으며 X 서버의 경우 wine과 같이 기본 해상도가 전제가 되어야 사용하는데 문제가 없다. 이를 이용한 사용법은 직접 시현을 통하여 알려 드리도록 하겠다.

4. 리눅스에서의 보안 그 중요성에 대하여.

리눅스는 언제라도 pc 한 대와 랜이 연결된 곳이라면 누구나 서버로서 사용을 할 수가 있다. 다시 말해서 누구나 깔수 있는 OS 이기에 보안 또한 관리자에 따라 허술하기 그지없을때가 많이 있다.

허나, 그것이 자신만의 시스템에 국한된 것이라면 상관없겠지만 다른 서버들에도 영향을 미칠수 있기에 보안은 철저히 하여야 한다. 그러할 때 전체 네트웍의 보안에는 구멍이 사라지는 것이다.

자 그러면 보안의 시작을 얘기해보기로 하자!!!

- tcp wrapper를 이용한 기본적인 보안 정책을 세우자

tcp_wrapper는 무엇이며, 어떻게 동작하는가? tcp_wrapper는 localhost로 들어오는 systat, finger, ftp, telnet, rlogin, rsh, exec, tftp, talk 등의 여러 인터넷 서비스에 대한 요청(request)을 관찰하고 필터링 하는 역할을 한다.

* wrapper의 작동원리

client program(telnet)-----server(in.telnetd)-----application(remote login)

client program(ftp)-----server(in.ftpd)-----application(file transfer)

위와 같이 telnetd나 ftpd와 같은 프로그램이 telnet또는 ftp와 같은 프로토콜(protocol)의 요청을 받아들여 실제 작업을 수행하는 것이 인터넷 서비스의 원리이다. tcp wrapper는 client와 server사이에 위치하며 어떤 프로토콜에 대해서 어떤 호스트의 어떤 사용자가 요청을 하였는가를 체크하여 허용되는 경우에는 실제 server를 불러주고, 그렇지 못한 경우에는 이런 정보들을 log로 남긴다. 이런 이유로 해서 tcpd(실제 wrapper)의 사용에는 overhead가 걸리지 않는다.

client(ftp)-----tcp wrapper(tcpd)-----server(in.ftpd)

* 결점

tcpd의 경우에는 가장 처음에 오는 client의 요청에만 반응하기 때문에 여러가지 서비스를 요구하는 nfs서비스에 대해서는 사용이 쉽지 않다. 이 문제는 관련된 서비스에 관한 문서를 참고하도록 한다.

* 실행방법

실제 문서에는 쉬운 방법과 어려운 방법을 모두 설명하였으나, 설치와 관련되어서는 마찬가지인 관계로 어렵다는 방법을 설명하겠다. 전혀 어렵지 않다.

/etc/inetd.conf의 항목에 대해서 첫번째 줄을 두번째 줄로 바꾸는 방식처럼 바꾼다.

tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /tftpboot

tftp dgram udp wait root /usr/sbin/tcpd in.tftpd -s /tftpboot

자 여기에 주목하라. /usr/sbin처럼 실제 데몬이 위치한 디렉토리는 다음 장에서 real_daemon_dir로 사용되게 된다. 이 디렉토리는 inetd.conf를 보고 알 수도 있고, which in.telnetd라고 해도 알 수 있다.

tcpd의 로그는 syslogd에 의해 결정된다. 실제 log가 남는 위치는 /etc/syslog.conf를 참고하라. 메시지는 log파일에 추가되고, console로 보내지거나 아니면 @loghost로 mail형태로 보내진다.

* 참고문서

readme file ftp.win.tue.nl:/pub/security/tcp_wrapper.ps.z (postscript)

ftp.win.tue.nl:/pub/security/tcp_wrapper.txt.z (flat text)

* 버그

irix는 많은 버그를 가지고 있으며 오래된 convexos또는 sunos5에는 조그만 버그가 있다.

* 설치에 필요한 파일들

tcp_wrappers-7.6.tar.gz

hosts.allow

hosts.deny

rfinger

* 압축 해제

다음 명령을 이용하여 압축을 해제한다.

gzip -cd tcp_wrappers-7.6.tar.gz | tar xvf -

* 컴파일

우선 make 만 하면,

% make

usage: edit the real_daemon_dir definition in the makefile then:

make sys-type

if you are in a hurry you can try instead:

make real_daemon_dir=/foo/bar sys-type

and for a version with language extensions enabled:

make real_daemon_dir=/foo/bar style=-dprocess_options sys-type

this makefile knows about the following sys-types:

generic (most bsd-ish systems with sys5 compatibility)

386bsd aix alpha apollo bsdos convex-ultranet dell-gcc dgux dgux543

dynix epix esix freebsd hpux irix4 irix5 irix6 isc iunix

linux machten mips(untested) ncrsvr4 netbsd next osf power_unix_211

ptx-2.x ptx-generic pyramid sco sco-nis sco-od2 sco-os5 sinix sunos4

sunos40 sunos5 sysv4 tandem ultrix unicos7 unicos8 unixware1 unixware2

uts215 uxp

if none of these match your environment, edit the system

dependencies sections in the makefile and do a 'make other'.

이렇게 나오고, 여기서 우선 real_daemon_dir 과 sys-type을 알 수 있다.

real_daemon_dir은 /etc/inetd.conf 파일 내에서 inetd들이 존재하는 디렉토리를 찾음으로서 알 수 있다. 다음은 /etc/inetd.conf 파일의 일부이다.

ftp stream tcp nowait root /usr/sbin/ftpd

telnet stream tcp nowait root /usr/sbin/telnetd

shell stream tcp nowait root /usr/sbin/rshd

login stream tcp nowait root /usr/sbin/rlogind

exec stream tcp nowait root /usr/sbin/rexecd

이 부분에서 daemon들이 /usr/sbin에 있음을 알 수 있다. 따라서 real_daemon_dir은 /usr/sbin이다.

sys-type은 다음 명령으로 확인한다.

% uname -a

osf1 foo.snu.ac.kr v4.0 564 alpha

이 예에서 sys-type 은 osf임을 확인할 수 있다.

이제는 make 명령으로 컴파일을 한다.

% make real_daemon_dir=/usr/sbin osf

이 때, 에러 또는 경고 메세지를 반드시 확인하도록 한다.

* 실행 파일의 복사

컴파일이 다 되었으면 tcpd, tcpdmatch, tcpdchk, safe_finger, try-from 파일이 생성되었을 것이다. tcpd 를 real_daemon_dir에 복사한다. 나머지 실행파일은 /usr/local/bin과 같은 적당한 곳에 복사한다.

# cp tcpd /usr/sbin

# cp tcpdmatch tcpdchk safe_finger try-from /usr/local/bin

* hosts.allow, hosts.deny의 수정과 복사

이제는 각 서비스 별로 서비스를 열고 닫을 호스트를 정해준다. 이는 hosts.allow와 hosts.deny를 수정하면 된다. 파일을 수정하는 방법은 다음과같다.

% vi hosts.allow

/etc/inetd.conf에서 현재 시스템에서 작동 중인 인터넷 서비스를 확인하고 그 데몬들의 이름을 확인한다. 시스템에서 사용하지 않은 데몬이 있을 경우는 hosts.allow 파일에서 # 를 붙인다.그리고, 각 데몬의 이름을 /etc/inetd.conf에서 확인하여 정확히 바꾸어 준다. 다음은 서비스별로 deny 할 호스트를 지정한다. 기본적으로 all 로서 allow하고, deny할 호스트를 expect 다음에 지정한다. 이 때, dns name보다는 ip address를 사용하기를 권장한다.

예)

rlogind: all \

except 147.46.67. \

147.46.10.10 \

147.46.82.242 \

147.46.80.220

hosts.allow의 수정이 끝나면, hosts.deny를 수정하는데, hosts.allow에서 except를 통해 지정했으므로 다음과 같이 설정한다.

% cat hosts.deny

all: all : (/usr/local/etc/rfinger %h %a %d >> /var/log/rfingerlog)|

hosts.allow와 hosts.deny의 수정이 끝났으면 /etc 디렉토리에 복사를 한다.

% cp hosts.allow /etc

% cp hosts.deny /etc

* rfinger의 복사

rfinger는 deny 된 host 접근을 log하기 위한 shell script이다. 파일은 /usr/local/etc에 복사하도록한다. 그리고 실행가능하도록 권한을 수정 한다.

% cp rfinger /usr/local/etc

% chmod a+x /usr/local/etc/rfinger

* inetd.conf의 수정

이제는 inetd.conf 를 수정할 차례이다.

#############

# tcp wrapper

#

#ftp stream tcp nowait root /usr/sbin/ftpd ftpd

#telnet stream tcp nowait root /usr/sbin/telnetd telnetd

#

shell stream tcp nowait root /usr/sbin/rshd rshd

#login stream tcp nowait root /usr/sbin/rlogind rlogind

#exec stream tcp nowait root /usr/sbin/rexecd rexecd

#

ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/ftpd

telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/telnetd

shell stream tcp nowait root /usr/sbin/tcpd /usr/sbin/rshd

login stream tcp nowait root /usr/sbin/tcpd /usr/sbin/rlogind

exec stream tcp nowait root /usr/sbin/tcpd /usr/sbin/rexecd

wrapper를 통한 서비스만을 수정하는데, 원래의 설정을 그대로 복사한 후, #기호를 붙이고 /usr/sbin/ftpd 등의 각 서비스를 /usr/sbin/tcpd - 디렉토리는 해당 디렉토리임 - 로 바꾼다. 그리고, 마지막에 그 전에 있던 서비스를 기입한다. 위의 예를 잘 참고하자.

* tcpdchk를 이용한 configuration 확인

여기까지가 wrapper의 설정은 끝났다. 이제는 tcpdchk를 통해서 제대로 설정이 되었는지를 확인한다.

% tcpdchk

이 때 에러가 나오면 해당 configuration를 수정한다.

* tcpdmatch를 이용한 configuration 확인

설정이 제대로 되었으면 tcpdmatch 를 통해 설정한 호스트에서 들어 왔을 때 deny 되는지 allow 되는지 여부를 확인한다.

usage: tcpdmatch [-d] [-i inet_conf] daemon[@host] [user@]host

-d: use allow/deny files in current directory

-i: location of inetd.conf file

% tcpdmatch ftpd slug

warning: slug: hostname alias

warning: (official name: slug.sogang.ac.kr)

client: hostname  slug.sogang.ac.kr

client: address ***.***.***.***

server: process ftpd

matched: /etc/hosts.allow line 39

access: granted

%tcpdmatch telnetd slug1.sogang.ac.kr

client: hostname slug1.sogang.ac.kr

client: address ***.***.***.***

server: process telnetd

matched: /etc/hosts.deny line 17

command: (/usr/local/etc/rfinger plaza.snu.ac.kr ***.***.***.*** telnetd >> /var/log/rfingerlog)

access: denied

* inetd의 재시동

여기까지 이상이 없이 되었으면 이제는 inetd를 재시동하여 wrapper가 작동하도록 한다. 우선 ps 명령으로 pid를 찾아낸다.

% ps -u root | grep inetd

388 ?? i 0:08.56 /usr/sbin/inetd

그리고 hup를 통해 작동시킨다.

% kill -hup 388

* 설치 확인

ccs.sogang.ac.kr 등 deny된 호스트에서 접근 했을 때, deny가 되고, log가 /var/log/rfingerlog 에 남아 있는지 확인한다. 우선, 우리는 텔넷에서 처럼 전송 제어 프로토콜(tcp)의 연결이 어떻게 이루어지는지 알 필요가 있다. tcp 네트워크 연결은 ‘클라이언트/서버’ 모델에 기반을 둔다. 텔넷 프로그램은 서버 프로그램 또는 telnetd 또는 in.teln etd(시스템 설정에 따라 다르다)라 불리는 데몬과 통신하는 하나의 클라이언트이다. 대부분의 리눅스 배포본들은 네트워크 데몬으로 /usr/sbin 디렉터리에서 in.[serv ice]d라는 이름을 사용하기 때문에 필자는 여기서부터 이름을 정하는 관례를 따를 것이다.

모든 네트워크 서비스에 대한 요청은 가장 먼저 인터넷 데몬, inetd 통하여 이루어진다(세상살이가 다 그렇지만 이 규칙에도 예외가 있다. 뒤에서 알아보겠다). 데몬은 네트워크 연결 요청에 대해서 어떻게 응답할 것인지 결정하기 위하여 두개의 설정 파일을 사용한다. /etc/servi ces에는 각각의 서비스 이름과 그 포트 번호가 나열되어 있다. /etc/inetd.conf에는 서비스 이름, 프로그램 이름, 서비스를 제공하는 데몬의 이름이 나와 있다. 리스트 1과 2는 /etc/services와 /etc/inetd.conf 파일의 일부이다. 내 시스템의 인터넷 주소를 my.linux-box.com이라 가정하고 다음과 같이 입력하였다면,

telnet your.machine.com

텔넷 클라이언트는 출발지의 인터넷 주소 my.linux-box.com과 도착지의 인터넷 주소 your.machine.com와 포트 번호를 담은 패킷을(다른 것들과 함께) 보낸다. 텔넷의 포트 번호는 23번이다. inetd는 /etc/services에서 23번 포트를 찾고 서비스 이름이 텔넷이라는 것을 알게 된다.

그 다음 텔넷을 /etc/inetd.conf에서 찾고 in.teln etd라 불리는 데몬을 실행할 필요가 있는지 알아본다. 리스트 2의 가장 오른쪽 컬럼에서 볼 수 있다. inetd는 in.telnetd를 포트 23을 연결하기 위하여 in.telnetd를 실행한다. 그 다음 또 접속하는 요구가 있는지 감시하는 일을 한다. in.telnetd가 클라이언트에 응답하면 사용자 이름과 패스워드를 묻고 텔넷 세션을 시작한다.

만약 여러분의 시스템으로 누구도 텔넷 접속을 하지 못하도록 하고 싶다면 어떻게 할까? 접속을 요청하는 출발지 주소를 보거나 또는 시스템이나 도메인 밖의 모든 주소를 거부하기 위해서 in.telnetd의 코드를 수정할 수 있다.

만약 텔넷이 유일한 네트워크 서비스라면 이 문제는 무척 쉽지만 수많은 네트워크 서비스가 존재하기 때문에 시스템에서 모든 데몬마다 접근을 제한하도록 수정하는 것은 끔직한 일이다.

리스트 1＞/etc/services의 예

ftp-data 20/tcp

ftp 21/tcp

telnet 23/tcp

smtp 25/tcp mail

exec 512/tcp # bsd rexecd(8)

login 513/tcp # bsd rlogind(8)

shell 514/tcp cmd # bsd rshd(8)

리스트 2＞/etc/inetd.conf의 예

ftp stream tcp nowait root in.ftpd

telnet stream tcp nowait root in.telnetd

#smtp stream tcp nowait root smtpd

shell stream tcp nowait root in.rshd

login stream tcp nowait root in.rlogind

exec stream tcp nowait root in.rexecd

여기서 tcp_wrappers가 이러한 끔직한 일에서 구해 줄 것이다. wrappers 프로그램은 inetd와 in.telnetd, in.ftpd와 같은 네트워크 데몬 사이에 있는 작은 데몬이다. 모든 tcp 접속은 시작될 때 기본적으로 같은 방식을 따르게 되므로 wrappers 프로그램은 거의 모든 tcp 네트워크 서비스에 대한 접근을 제어하는데 사용할 수 있다.

wrappers가 설치되면 인터넷 데몬은 보통 네트워크 데몬 대신 wrappers를 실행하기 위하여 다시 설정된다. wrappers는 접속된 출발지 주소와 서비스를 체크하고 접속을 허가할 것인지 결정한다. 만약 your.machine.com이 내가 보낸 텔넷 세션의 요청을 거부한다면 접속을 끊는 길밖에 없다. 접속이 허용되면 모든 것은 정상적으로 처리되는데 wrappers는 실제로 내 텔넷 클라이언트에서만 작동하는 것은 아니다. 어느 쪽에나 wrappers는 시스템에 성공적으로 연결되었는지 알 수 있도록 하기 위해서 시스템 로그에 기록한다

필요없는 서버 데몬을 죽인다. 리눅스를 설치할 때 대부분의 데몬이 패키지와 함께 올라간다. 써비스 하지않는 데몬은 확인하여 부팅시 기본적으로 올라가지 않도록 해야 한다.

그럼 첫 번째로 inted 수퍼 서버에 의해 자동 관리되는 녀석을 건드려 보기로 하겠다.

[root@slug /etc]# cat inetd.conf |more

# inetd.conf this file describes the services that will be available

# through the inetd tcp/ip super server. to re-configure

# the running inetd process, edit this file, then send the

# inetd process a sighup signal.

#

# version: @(#)/etc/inetd.conf 3.10 05/27/93

#

# authors: original taken from bsd unix 4.3/tahoe.

# fred n. van kempen, <waltje@uwalt.nl.mugnet.org>

#

# modified for debian linux by ian a. murdock <imurdock@shell.portal.com>

#

# modified for rhs linux by marc ewing <marc@redhat.com>

#

# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>

#

# echo, discard, daytime, and chargen are used primarily for testing.

#

# to re-read this file after changes, just do a 'killall -hup inetd'

#

#echo stream tcp nowait root internal

# echo, discard, daytime, and chargen are used primarily for testing.

#

# to re-read this file after changes, just do a 'killall -hup inetd'

#

#echo stream tcp nowait root internal

#echo dgram udp wait root internal

#discard stream tcp nowait root internal

#discard dgram udp wait root internal

#daytime stream tcp nowait root internal

#daytime dgram udp wait root internal

#chargen stream tcp nowait root internal

#chargen dgram udp wait root internal

#time stream tcp nowait root internal

#time dgram udp wait root internal

#

# these are standard services.

#

ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd

#

여러분들도 다 아시다시피 ftp,telnet등은 기본적인 서비스이기 때문에 그것을 막기에는 약간 찜찜한 구석이 있다. 그러나 해킹을 당했을 경우에는 추가적인 해킹의 우려를 방지하기 위하여 과감하게 이 두가지의 서비스도 막을수 있다. telnet를 대신하여 ssh를 사용한다거나 ftp,telnet을 독립적인 데몬으로 서비스 하는 방법도 시스템의 안정에는 좋은 방법이라고 생각한다.(물론, 조금 귀찮기는 하지만...)

# shell, login, exec, comsat and talk are bsd protocols.

#

#shell stream tcp nowait root /usr/sbin/tcpd in.rshd

#login stream tcp nowait root /usr/sbin/tcpd in.rlogind

#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd

#comsat dgram udp nowait root /usr/sbin/tcpd in.comsat

#talk dgram udp nowait nobody /usr/sbin/tcpd in.talkd

#shell stream tcp nowait root /usr/sbin/tcpd in.rshd

#login stream tcp nowait root /usr/sbin/tcpd in.rlogind

#exec stream tcp nowait root /usr/sbin/tcpd in.rexecd

#comsat dgram udp nowait root /usr/sbin/tcpd in.comsat

#talk dgram udp nowait nobody /usr/sbin/tcpd in.talkd

#ntalk dgram udp wait nobody /usr/sbin/tcpd in.ntalkd

#dtalk stream tcp wait nobody /usr/sbin/tcpd in.dtalkd

#

위의 서비스들은 버그와 원격 로그인이라는 보안의 치명적인 약점들을 가지고 있는 서비스 들이다. 물론, talk가 꼭 필요하다면 어쩔수가 없겠지만 그럴 경우 가능하면 웹채팅과 같은 형태의 조금 안전한 방법을 추천하고 싶다.

# pop and imap mail services et al

#

#pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d

pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d

imap stream tcp nowait root /usr/sbin/tcpd imapd

#

pop3는 이메일을 사용하기 위해서 필요한 서비스이지만 imap 같은 녀석은 주석 처리를 하기 바란다.최근에 imap를 이용한 해킹 사고가 많이 보고 되고 있기 때문이다.

# the internet uucp service.

#

#uucp stream tcp nowait uucp /usr/sbin/tcpd /usr/lib/uucp/uucico

-l

#

# tftp service is provided primarily for booting. most sites

# run this only on machines acting as "boot servers." do not uncomment

# this unless you *need* it.

#

#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd

#bootps dgram udp wait root /usr/sbin/tcpd bootpd

#

# finger, systat and netstat give out user information which may be

#

# tftp service is provided primarily for booting. most sites

# run this only on machines acting as "boot servers." do not uncomment

# this unless you *need* it.

#

#tftp dgram udp wait root /usr/sbin/tcpd in.tftpd

#bootps dgram udp wait root /usr/sbin/tcpd bootpd

#

# finger, systat and netstat give out user information which may be

# valuable to potential "system crackers." many sites choose to disable

# some or all of these services to improve security.

#

#finger stream tcp nowait root /usr/sbin/tcpd in.fingerd

#cfinger stream tcp nowait root /usr/sbin/tcpd in.cfingerd

#systat stream tcp nowait guest /usr/sbin/tcpd /bin/ps -auwwx

#netstat stream tcp nowait guest /usr/sbin/tcpd /bin/netstat

-f inet

#

위의 서비스들은 네트웍 사용의 편의성을 제공하기 위해서 존재하는 서비스들이다. 즉, finger등의 정보는 내부 네트웍 및 그 사용자들의 현황을 외부 세계에 있는 사람들에게 훤히 들어내 보이는 결과를 초래하는 것이다. 그러하게에 가능하면 공개적으로 운영되어지는 서버의 경우에는 이들을 주석처리하는 것이 바람직하다고 생각되어진다.

# authentication

#

auth stream tcp nowait nobody /usr/sbin/in.identd in.identd -l -e -o

#

# end of inetd.conf

linuxconf stream tcp wait root /bin/linuxconf linuxconf --http

#swat stream tcp nowait.400 root /usr/sbin/swat swat

이상으로로 inted.conf의 설정 파일들에 대해서 알아 보았다.

그외에 몇가지 보안과 관련해서 신경을 써야할 파일을 확인해 보겠다.

아래의 파일은 ftp 접속을 제한하는 유저들의 id이다.

[root@slug /etc]# cat ftpusers |more

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

news

uucp

operator

games

nobody

필요없는 유저의 허가는 삼가하기 바란다.

아래의 내용은 루트가 사용 가능한 가상 콘솔 tty1-8번 까지 기본적으로 들어 있는 파일이다. 원격으로 root의 접근은 반드시 불허해야 한다. su를 이용하여 루트로 login하기를 권장한다.

[root@slug /etc]# cat securetty |more

tty1

tty2

tty3

쉐도우 패스워드를 사용하자!!!

왜? 한마디로 보안을 위해서.... 왜 /etc/passwd 파일을 숨겨야 하는가? 일반적으로 password를 포함한 대부분의 사용자 정보는 /etc/passwd에 보관되어 있다. password는 암호화 되어서 encrypted 저장된다. password는 encode된 형식으로 존재한다. 이유는 crypt를 적용할 때 text는 null로 하고 password를 key로 사용하기 때문이다.

password를 encode 하는데 사용하는 연산방식은 기술적으로는 단방향 hash function 과 같은 방법으로 간주되고 있다. 이것은 순방향으로는 계산하기 편하게 되어 있지만 역방향은 연산이 매우 힘들게 되어 있는 구조를 가지고 있다. 무질서하게 encode된 password를 획득해서 원래의 password를 조합하는 것은 사실 어려운 일이다, 그러나 수많은 사람들이 사용하는 서버에서는 한두개의 password는 일상단어로 이루어져 있을 것이다 바로 이런 헛점을 크랙커들은 노리고 있는 것이다.

즉, 흔히 사용하는 password와 단어를 가능한 가능한 4096가지 salt 값을 사용해서 encrypt을 실행할 것이다. 그 다음에 db에 있는 password와 encodeehls password를 비교할 것이다. 그다음은 여러분의 상상에 맡기기로 하겠다.이것을 일반적으로 dictionary attack이라고 한다.

shadow suite는 password를 다른 파일에 위치시킴으로써 이문제에서 자유로울수 있다. 다시 말해서 /etc/shadow 디렉토리에 위치시킴으로서 모든 유저가 파일에 대한 접근을 할 수 없게 만드는 것이다. 오로지 root만이 이화일을 보고 쓸수가 있다. 이를 통하여 dictionary attack을 감행하는 크랙커들로부터 중요한 시스템을 보호할 수 있는 것이다. 이것이 쉐도우 패스워드 사용의 목적이라고 할 수 있다.

내부 사용자들을 주의하라!!!

많은 크랙킹이 외부에서 이루어지는 것으로 오인하는 경우가 종종 있다. 그러나 항상 그러하지는 않다. 내부 사용자에 의한 공격 또한 주의해서 관찰해야 할 대목이다. 그것이 아니더라도 외부에서 내부 사용자의 id를 얻는 것 이야말로 가장 흔한 크래킹의 경우이다. 내부 사용자들에 대한 보안이 느슨해지면 침입자들은 여러 버그들과 시스템의 약점을 이용해서 일반 id를 획득하여 관리자의 id를 획득할 수있다.

그러하기에 항상 관리자는 주의해야 할 것이 퍼미션에 관계된 문제를 소홀히 다루어서는 안된다는 것이다. 일반유저들에게는 최소한의 권한만을 부여하고 사용자의 로그를 잘 분석 해야하며 필요하다면 과감히 계정을 막아야 할 것이다. 즉, 내부 사용자가 다른 사이트를 통하여 텔넷 접속을 해올 경우 허가를 받아서 사용할수 있도록 한다던가 사용자의 퀘터를 제한 둔다던가 하는 나름대로의 룰을 정하여 거기에 위반이 되지 않도록 하는 방식등을 통해서 내부 사용자에 대한 방어를 해야 할 것이다.

log 분석을 게을리 하지 마라.

/var/log 에 lastlog,message 파일의 분석을 정기적으로 분석하기 바란다. 혹시 전혀 알 수 없는 사이트로부터 접속 시도나 login이 이루어 졌다면 반드시 확인 작업을 하기 바란다. 그들은 여러분의 서버에 스크립트 하나를 깔아서 전체 네트웍을 스캔하고 그를 통하여 다른 서버의 접속을 시도할 것이며 그를 통해서 네트웍에 장난을 칠 것이다. 처음보는 파일이나 디렉토리, 특별히 등록이 안되어 있는 유저가 만들어져 있다면 그것은 대부분이 크랙커의 장난일 수가 있다. 그럴때는 일단 알지 못하는 유저의 id는 죽이고 log를 분석하여 랩퍼로 상대 호스트의ip와 도메인을 막아야 할 것이다. 왜냐하면, 하나의 서버가 뚫렸다면 그 다음은 아주 우습게 루트 권한을 획득할 수 있기 때문이다.

그러하기에 시스템 관리자가 아니라도 자신의 서버가 네트웍에 물려 있다면 자신의 서버를 사랑하고 관심을 가져줘야 할 것이다. 이외에도 보안을 얘기하면 한도 끝도 없을 것 같다. 그외의 부분은 세미나 홈이나 게시판에 자료를 올릴 것이다. 그것을 참고하여 보다 효율적으로 보안을 공부하기 바란다.

보안이 전혀 중요하지 않다고 생각하는 리눅서가 혹여라도 있을지 모르겠다. 클라이언트 사용자에게 무슨 보안?

허나, 보안 문제는 시스템 관리자만의 것이 아니다. 여러분의 pc가 네트웍에 연결이 되어 있다면 그것은 바로 해커의 먹이가 될 수 있다는 사실을 명심하기 바란다. 필자가 네트웍 관리자이기에 교내의 리눅스 박스가 부서지고 깨어지는 모습을 많이 보아왔다. 조금만 보안에 신경을 쓰면 됐을 것을 나중에 데이터가 깨지고 시스템이 망가지고 난 다음에 후회하는 모습을 많이 보아왔다 그래서 보안은 전제인 것이다. 바쁘더라도 최소한 랩퍼와 필요없는 데몬들은 죽이고 사용하시기를 간절히 부탁드린다. 그리고 문제가 생기면 관리자에게 꼭꼭 연락하는 습관을 가지기 바란다

6. 후기.

난 강사로서 운영진으로서 이번 세미나에 참여를 했다. 준비를 하면서 느낀 감정은 세미나준비팀이 너무나 고생한다는 사실이었다. 정말 고맙고 사랑스러운 동생들이다. 그들 모두에게 진한 사랑과 공유의 정신을 느낄수 있었다. 끝으로 원고를 꼴찌로 넘기게 되어서 잠도 못잔 태구리와 미경이에게 미안하다는 말을 전하고 싶다.

아울러, 항상 옆에서 도와주고 지켜주는 사랑하는 아내에게 고마움을 전한다.그리고 리눅스에 빠져서 제대로 신경도 못써주는 사랑하는 아들 최영과 세린이에게도 아빠의 사랑을 듬뿍 전하고 싶다.

마지막으로 리눅스를 나에게 알게해준 또한 그로인하여 커다란 기쁨을 느낄수 있도록 도와준 서강대의 많은 이들과 세미나 준비과정에서 도움준 업체분들 특히, ICM의 박종극형에게 특별한 고마움을 전한다.