16장.네트워크 보안 프로그래밍 소프트웨어공학연구실 최 상 수

Slides:



Advertisements
Similar presentations
7 장. 원격지에서 리눅스서버를 관리하자. 텔넷서버를 설치 / 운영한다. SSH 서버를 운영한다. VNC 서버를 설치 / 운영한다.
Advertisements


정보 보안 개론과 실습 네트워크 해킹과 보안 3부 해킹 전 정보 획득 Chapter 10. 목록화.
한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Chapter 6. 리눅스 백도어 황 선 환.
Network Lab. Young-Chul Hwang
TCP Client/Server Program
PHP입문 Izayoi 김조흔.
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
Linux Socket Programming - Introducing Sockets –
Chapter 03. 소켓 주소 구조체 다루기.
Linux System Programming
Department of Computer Engineering
Department of Computer Science and Engineering
TCP Client/Server Program
발표자 : 손충호 조원 : 유진우, 노유성, 조사랑, 손충호
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Inetd Daemon의 이용 VLSI 석사 3학기 고재현.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
제 14장 Multicast & Broadcast
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
31강 JAVA 네트워크 JAVA 네트워크 InetAdress, URLConnection 클래스 Socket의 이해
Using Standard I/O on Sockets
Department of Computer Engineering
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Department of Computer Engineering
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재
Linux서버를 이용한 채팅프로그램 지도 교수님 : 이형원 교수님 이 름 : 이 은 영 학 번 :
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
07. 디바이스 드라이버의 초기화와 종료 김진홍
Chapter 7. RAS(전화접속,VPN) & IAS
8장. 원격지 시스템 관리하기.
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
파이프와 exec 시스템 호출 (ls | wc)
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
Chapter 06. UDP 서버/클라이언트.
NJM Messenger 박상원 박연호.
                              데이터베이스 프로그래밍 (소프트웨어 개발 트랙)                               퍼스널 오라클 9i 인스톨.
01. DHCP의 개념 조직의 네트워크에 연결되어 있는 워크스테이션의 TCP/IP 설정을 자동화하기 위한 표준 프로토콜
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당
Department of Computer Science and Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
Chapter 03. 소켓 주소 구조체 다루기.
Socket Address Structure and Byte Ordering Functions
시스템 인터페이스 Lab3 Unix 사용법 실습.
제 15 장 BOOTP와 DHCP BOOTP 15.2 동적 호스트 설정 프로토콜.
뇌를 자극하는 Windows Server 장. 원격 접속 서버.
(개정판) 뇌를 자극하는 Red Hat Fedora 리눅스 서버 & 네트워크
Chapter 12. 파일, 프린트 서버관리 네트워크 환경에서 파일서버, 프린트 서버를 구축하여 사용하는 것은 기본이다. 효율성 있는 파일서버의 관리방법에 대해서 설명하고 있으며, 프린트 서버를 운영할 때 참고할 만한 기능에 대해서도 설명한다. 분산파일시스템, 디스크할당량.
Department of Computer Engineering
DHCP 조지훈 김대성 이정민 용석중.
네트워크 환경 구축과 이미지 전송 호스트/타겟 통신 직렬 통신을 이용한 이미지 전송 수퍼 데몬 BOOTP 환경 구축
프로젝트 제안서 -TCP/IP를 이용한 메신저 구현-
01. DHCP의 개념 조직의 네트워크에 연결되어 있는 워크스테이션의 TCP/IP 설정을 자동화하기 위한 표준 프로토콜
01. 개요 네트워크에 있는 컴퓨터와 그룹에 대한 NetBIOS 이름에 대응되는 IP 주소를 찾아주는 서비스
Chapter 04. TCP 서버/클라이언트.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
MIDP 네트워크 프로그래밍 ps lab 김윤경.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
프로그래밍 언어 학습을 위한 가상실습환경 창원대학교 이수현.
채팅 및 파일전송 프로그램 권 경 곤 김 창 년.
06. 디바이스의 등록과 해제 김진홍
Presentation transcript:

16장.네트워크 보안 프로그래밍 소프트웨어공학연구실 최 상 수 16장.네트워크 보안 프로그래밍 소프트웨어공학연구실 최 상 수

목차 보안에 대한 정의 보안 문제점들 적과 아군의 식별 Inetd 서버의 보호 래퍼 및 서버 프로그램의 설치 클라이언트 프로그램의 소개 래퍼의 설치 및 테스트 데이터그램 취약성

보안에 대한 정의 네트워크 보안 The Merriam Webster’s Collegiate Dictionary 위협으로부터의 자유와 같은 안전한 특성 또는 상태 스파이행위 또는 사보타주, 범죄, 공격, 누출에 대항하여 이루어지는 보호의 측정 네트워크 보안 인지된 위협으로부터의 자유 무단 조사, 사보타주, 도난 또는 기타 공격으로부터 시스템 자원들의 보호

보안 문제점들 Lock의 형태 보안 방법들의 약점 무장 경비원의 고용 키-기반과 카드-기반 Lock : 물리적 토큰 Lock과 패스워드, PIN 번호의 조합 : 비밀 지식 망막, 지문과 성문(voice print) 스캔 : 유일한 특징 보안 방법들의 약점 물리적 토큰 → 복사 비밀 지식 → 공유, 기록, 추측 유일한 특징 → 무력

보안 문제점들 보안에 대한 기본적인 진리 한 명의 사용자에게 접근 권한을 허가한 시스템은, 잠재적으로 다른 사용자들에게도 마찬가지로 접근을 허용할 수 있다. 어느 누구도 접근 권한을 얻지 못하는 시스템만이, 오직 완벽하게 안전한 시스템이다. 결론 자원에 대한 타당하고 안전한 접근이 허용되는지, 항상 보안에 대하여 고려해야만 한다.

적과 아군의 식별 IP 번호 →호스트네임과 도메인네임 분석(적용 가능한 접근정책) 특정 호스트 네임들에 대한 접근 허가 특정 도메인들에 대한 접근 허가 특정 호스트 네임들에 대한 접근 거부 특정 도메인들에 대한 접근 거부 어떤 이름으로 분석되지 않은 IP 번호들에 대한 접근 거부

적과 아군의 식별 호스트네임 또는 도메인네임에 의한 보호 Accept(2) Recvfrom(2) Gethostbyaddr(3)

적과 아군의 식별 Accept(2) 예제 Struct sockaddr_in adr_clnt; Int len_inet; Int c; …… Len_inet = sizeof adr_clnt; c = accpt(s, (struct sockaddr *)&adr_clnt, &len_inet);

적과 아군의 식별 Recvfrom(2) 예제 Int z; Struct sockaddr_in adr_clnt; Int len_inet; Int s; char dgram[512]; len_inet = sizeof adr_clnt; z = recvfrom(s, dgram, sizeof dgram, 0, (struct sockaddr *)&adr_clnt, &len_inet);

적과 아군의 식별 Gethostbyaddr(3) 예제 Struct sockaddr_in adr_clnt; Struct hostent *hp; hp = gethostbyaddr( (char *)&adr_clnt.sin_addr, sizeof adr_clnt.sin_addr, adr_clnt.sin_family); If(!hp) fprintf(logf, “ERROR: %s\n”, hstrerror(h_errno)); else printf(logf, “ %s\n”, hp->h_name);

적과 아군의 식별 IP 번호에 의한 식별 보안 문제 : IP 번호를 받을때 또다른 네트워크 프로세스를 사용하여 그 번호를 호스트네임으로 분석해야만 함 IP 번호를 단독으로 사용 IP 번호 갱신 자신들의 IP 번호를 모르는 사용자 처리 로그 파일에 기록 네트워크 ID 단계에서의 접근 제한

Inetd 서버의 보호 중앙 집중화된 정책 Inetd 데몬 TCP 래퍼 프로그램 클라이언트 요청을 위한 listen에 필요한 모든 코드 제공 필요시에만 서버를 구동 중앙 집중화된 네트워크 보안 모델의 설치 가능 TCP 래퍼 프로그램 Wietse Venema의 TCP 래퍼 프로그램 (레드헷 6.0) Tcpd 프로그램이 inetd와 서버 사이에 자신을 삽입 투명한 방법으로 이루어짐

Inetd 서버의 보호 TCP 래퍼 개념의 이해 tcpd Remote Client1 inetd In.telnetd fork(2)&exec(2) exec(2)

Inetd 서버의 보호 원격 클라이언트가 in.telnetd 서버에 접속하는 프로세스 tcpd Remote Client1 fork(2)&exec(2) exec(2) 1.연결요청 2.요청수락 3.새로운 프로세스 fork(2) / 부모 프로세스는 listen 4.자식 프로세스는 exec(2) 호출하여 usr/sbin/tcpd 실행 5.접속허가여부 결정 6.거부:종료 7.허가:경로 명시 /usr/sbin/in.telnetd 8.입출력 수행

Inetd 서버의 보호 번호를 사용 서버 프로세스가 부모 inetd의 직접적인 자식 프로세스일 때에만 정확하게 수행한다! 자식 PID 1243 PID 1243 서버 프로세스가 부모 inetd의 직접적인 자식 프로세스일 때에만 정확하게 수행한다! Remote Client1 inetd In.telnetd tcpd fork(2)&exec(2) exec(2) PID 1243 Wait(2) 호출 PID 124 종료시 SIGCHLD

Inetd 서버의 보호 접근 결정 서비스 결정 클라이언트의 신분 결정 데이터그램 클라이언트의 신분 결정 Getsoketname(2) 함수 : 소켓 주소, 서비스 포트 번호 클라이언트의 신분 결정 Getpeername(2) 함수 : 클라이언트의 주소, 포트 번호 데이터그램 클라이언트의 신분 결정 데이터그램은 accept(2) 함수를 사용하지 않음 MSG_PEEK 플래그 옵션 + recvfrom(2) 함수 MSG_PEEK : 클라이언트의 주소를 리턴

Inetd 서버의 보호 MSG_PEEK 플래그 옵션 + recvfrom(2) 함수 Int z; Struct sockaddr_in adr_clnt; Int len_inet; Int s; Char dgram[512]; Len_inet = sizeof adr_clnt; z = recvfrom(s, dgram, sizeof dgram, MSG_PEEK, (struct sockaddr *)&adr_clnt, &len_inet);

래퍼 및 서버 프로그램의 설치 서버와 래퍼 로깅 코드의 시험 리스트 16.1 : log.c 로그 파일 open : log_open() 21: Int 22: Log_open(const char *pathname) { 23: 24: logf = fopen(pathname, “a”); 25: return logf ? 0 : -1; 26: }

래퍼 및 서버 프로그램의 설치 Printf(3) 스타일의 로깅 함수 : log() 31: Void 32: Log(const char *format,…) { 33: va_list ap; 34: 35: if(!logf) 36: return; 37: 38: fprintf(logf, “[PID %ld] “, (long)getpid()); 39: 40: Va_start(ap, format); 41: vfprintf(log, format, ap); 42: va_end(ap); 43: fflush(logf); 44: }

래퍼 및 서버 프로그램의 설치 로그 파일 close : Log_close() 49: Void 51: 52: if(logf) 53: fclose(logf); 54: logf = NULL; 55: }

래퍼 및 서버 프로그램의 설치 로그 파일에 출력 내용 기록 : bail() 61: Void 62: Bail(const char *on_what) { 63: 64: if(logf) { 65: if(errno) 66: log(“%s: “, strerror(errno)); 67: log(“%s\n”, on_what); 68: log_close(); 69: } 70: exit(1); 71: }

래퍼 및 서버 프로그램의 설치 리스트 16.2 : log.h 1: /* log.h 2: * 3: * log.c externs: 4: */ 5: extern int log_open(const char *pathname); 6: extern void log(const char *format,…); 7: extern void log_close(void); 8: extern void bail(const char *on_what);

래퍼 및 서버 프로그램의 설치 데이터그램 서버 코드의 시험 리스트 16.3 : dgramisrvr.c 로그파일 open Server Loop 시작(for) 데이터그램 read 데이터그램 종료 Date/time 요청 처리 Client에 결과 응답 다른 데이터그램 wait 에러/타임아웃 기록 Error/timeout 데이터그램 도착

래퍼 및 서버 프로그램의 설치 로그 파일 open if(log_open(LOGPATH) == -1) exit(1); log(“dgramisrvr started.\n”); S = 0; FD_ZERO(&rx_set); FD_SET(s, &rx_set);

래퍼 및 서버 프로그램의 설치 데이터그램 read alen = sizeof adr_clnt; z = recvfrom(s, dgram, sizeof dgram, 0, (struct sockaddr *)&adr_clnt, &alen); If(z < 0) bail(“recvfrom(2)”);

래퍼 및 서버 프로그램의 설치 데이터그램 종료 Date/time 요청 처리 dgram[z] = 0; time(&td); dtv = *localtime(&td); strftime(dtfmt, sizeof dtfmt, dgram, &dtv);

래퍼 및 서버 프로그램의 설치 클라이언트에 결과 응답 Z = sendto(s, dtfmt, strlen(dtfmt, 0, (struct sockaddr *)&adr_clnt, alen); if(z < 0) bail(“sendto(2)”);

래퍼 및 서버 프로그램의 설치 다른 데이터그램 wait Select(2) 호출의 리턴값 do { tmout.tv_sec = 8; tmout.tv_usec = 0; z = select(s+1, &rx_set, NULL, NULL, &tmout); } while(z == -1 && errno = EINTR); Select(2) 호출의 리턴값 데이터그램 도착 : 1 Timeout : 0 Error : -1

래퍼 및 서버 프로그램의 설치 Error/timeout 발생시 for loop 종료 Error/timeout 메시지 기록 if(z <= 0) break; Error/timeout 메시지 기록 if(z == -1) log(“%s: select(2)\n”, strerror(errno)); else log(“Timed out: server exiting.\n”);

래퍼 및 서버 프로그램의 설치 간단한 TCP 래퍼 프로그램의 시험 리스트 16.4 : wrapper.c 로그파일 open 데이터그램 주소 결정 주소→스트링 변환 클라이언트 주소 Test 요청 거부 요청 허가

래퍼 및 서버 프로그램의 설치 간단한 보안 정책 구현 클라이언트 주소 Test 클라이언트 주소 = 127.7.7.7 → 요청 허가 그 이외의 주소 → 요청 거부 클라이언트 주소 Test …… str_addr = inet_ntoa(adr_clnt.sin_addr); If(strcmp(str_addr, “127.7.7.7”) != 0) {

래퍼 및 서버 프로그램의 설치 요청 거부 log(“Address %s port %d rejected.\n”, str_addr, ntohs(adr_clnt.sin_port)); // 요청 기록 z = recvfrom(0, // 데이터그램 discard dgram, sizeof dgram, 0, (struct sockaddr *)&adr_clnt, &alen); if(z < 0) // 에러 기록 및 종료 bail(“recvfrom(2), eating dgram”); exit(1);

래퍼 및 서버 프로그램의 설치 요청 허가 log(“Address %s port %d accepted.\n”, str_addr, ntohs(adr_clnt.sin_port)); // 요청 기록 log(“Starting ‘%s’\n”, argv[0]); // 시작상태 기록 log_close(); // 로그 close z = execve(argv[0], argv, envp); // 래퍼 교체

클라이언트 프로그램의 소개 리스트 16.5 : dgramcln2.c 6장의 리스트 6.2 dgramclnt.c와 비슷함 두개의 command-line argument 요구 If(argc != 3) { fputs(“Usage: dgramclnt <server_ipaddr>” “<client_ipaddr>\n”, stderr); return 1; }

클라이언트 프로그램의 소개 로컬 소켓의 IP 주소 한정 memset(&adr_clnt, 0, sizeof adr_clnt); adr_clnt.sin_family = AF_INET; adr_clnt.sin_port = 0; adr_clnt.sin_addr.s_addr = inet_addr(clnt_addr); if(adr_clnt.sin_addr.s_addr == INADDR_NONE) bail(“bad client address.”); z = bind(s, (struct sockaddr *)&adr_clnt, sizeof adr_clnt); if(z == -1) bail(“bind(2) of client address”);

래퍼의 설치 및 테스트 Inetd 데몬의 실행 $ /usr/sbin/inetd /tmp/inetd.conf $ $ ps –ef | grep inetd Root 313 1 0 Feb15 ? 00:00:00 inetd Studnt 12763 1 0 23:04 ? 00:00:00 /usr/sbin/inetd /tmp/inetd.conf Studnt 12765 11739 0 23:04 ? 00:00:00 grep inetd

래퍼의 설치 및 테스트 래퍼 프로그램의 테스트 $ ./dgramcln2 127.0.0.1 127.7.7.7 Enter format string: %A %B %D Result from 127.7.7.7 port 9090 : ‘Tuesday November 11/09/99’ Enter format string:

래퍼의 설치 및 테스트 Wrapper log Server log $ tail –f /tmp/wrapper.log [PID 1279] wrapper started. [PID 1279] Address 127.7.7.7 port 1027 accepted. [PID 1279] Starting ‘/tmp/dgramisrvr’ Server log $ tail –f /tmp/dgramisrvr.log [PID 1279] dgramisrvr started. [PID 1279] Got request ‘%A %B %D’ from 127.7.7.7 port 1027 [PID 1279] Timed out: server exiting.

래퍼의 설치 및 테스트 서버 timeout 테스트 $ ./dgramcln2 127.0.0.1 127.7.7.7 Enter format string: %x Result from 127.7.7.7 port 9090 : ‘11/09/99’ Enter format string: %x %X ‘11/09/99 19:11:32’ Enter format string: CTRL+D $

래퍼의 설치 및 테스트 8초 이내에 처리했을 경우 단일 프로세스로 처리됨 $ tail –f /tmp/dgramisrvr.log [PID 1279] dgramisrvr started. [PID 1279] Got request ‘%A %B %D’ from 127.7.7.7 port 1027 [PID 1279] Timed out: server exiting. [PID 1294] dgramisrvr started. [PID 1294] Got request ‘%x’ from 127.7.7.7 port 1027 [PID 1294] Got request ‘%x %X’ from 127.7.7.7 port 1027 [PID 1294] Timed out: server exiting.

데이터그램 취약성 데이터그램 서버를 위한 래퍼 설계시 취약성 서버 루핑 데이터그램 도착, inetd에게 통보 래퍼 프로그램은 exec(2) 호출 데이터그램 서버는 데이터그램을 읽고 처리 서버는 다른 데이터그램을 위해 wait 데이터그램 도착하면, 4부터 반복 그렇지 않다면, 서버는 timeout되고 종료됨 1부터 반복

데이터그램 취약성 선택 가능한 옵션 단계 3 → 보안 점검 서버가 계속 실행중인 동안 프로세스는 단계 4부터 반복 → 보안 점검 생략 선택 가능한 옵션 오직 nowait 스타일의 데이터그램을 사용 처리 전에 각 데이터그램 테스트 위해, 데이터그램 서버 내에 custom 코드 사용

요약