티스토리 툴바


/**
 오래간만에 휴가 기간이다. 아무런 생각도 하지말고 '분산 시스템'이라는 주제에 대해 포스팅을 시작해 보자.
*/ 

분산 시스템(Distributed System)?
분산 시스템의 교과서 적인 Distributed System Concepts (Andrew S. Tanenbaum) 의 말을 빌리자면
 "하나의 시스템 처럼 보이는 독립된 컴퓨터들의 집합"
 (A distributed system is a collection of independent computers that appears to its users as a sigle coherent system)
이라고 정의하고 있다.

위의 정의를 두 가지 주요한 관점으로 바라 볼 수 있다. 한가지는 하드웨어 - 독립되어 자율적으로 돌아가는 하드웨어 머신, 다른 한 가지는 소프트웨어 - 유저 관점에서 보았을 때 마치 하나의 시스템으로 여겨지는 시스템. 위 두가지 사항은 분산 시스템을 구성하는 핵심적인 요소이며 시스템을 디자인 할 때 절대 잊어서는 안되는 원칙이다.

위 두 가지 대 원칙을 가지고 분산 시스템을 디자인 할 때, 다시 아래의 생각들을 해봐야 한다.
 - 다양한 컴퓨터(or 장비)들 사이에 다양한 통신 방법들을 어떻게 사용자로 부터 숨길 것인가?
 - 어떻게 사용자와 시스템 간의 일관적이고 단일화된 커뮤니케이션 통로만들 것인가?

지금 까지 컴퓨터 네트워크의 발전사를 살펴 보면 다양한 커뮤니케이션 방법, 컴퓨터의 종류, 통신 장비들을 이용하기 위해서 레이어(Layer)를 두고 각 레이어마다 프로토콜을 정해 사용자에겐 자신이 직접적으로 닿고 있는 레이어만 신경쓰면 얼마든지 시스템에 접근 할 수 있도록 하는 형태로 발전해 왔다.  예를 들자면 OSI 7 layer, TCP/IP 와 같은 것들이 있다.

위와 같은 레이어링은 하드웨어 뿐만 아니라 소프트웨어 디자인에도 상당한 도움이 된다는 사실을 기억하자.

분산 시스템의 목적?
그렇다면 왜 유저 관점에서 하나 처럼 보이지만 뒤에서는 여러 다양한 컴퓨터들로 구성되어 있는 복잡 다단한 분산시스템이라는 것을 만들어야 하는 것일까?

내가 생각하는 가장 첫번째 이유는 자원의 부족 때문이다. 여기서 말하는 '자원'이라는 것에는 컴퓨터의 CPU 파워, 메모리, 하드 디스크 스토리지 등등 우리가 사용하는 모든 컴퓨터의 자원을 의미한다. 요즘 같은 서버-클라이언트 구조의 서비스들이 점점 더 발달할 수록 더 많은 자원을 요구하게 되고, 머신 한 대로 처리 할 수 있는 양에는 한계가 있다. 그래서 우리는 분산 시스템을 도입하여 위의 문제를 해결한다.

두 번째는, 장애시 대처다. 단일 머신에서 돌아가는 시스템이라면 해당 머신의 수명이 다하거나 어떠한 불의의 사고로 다운이 되게 된다면 모든 시스템이 다운되게 된다. 하지만 여러 대의 머신이 분산하여 연산을 처리하고 데이터를 저장하고 있다면 한대의 장애가 전체 시스템의 장애로 이어지지는 않는다. 이를 위해서도 분산 시스템은 필요하다.

셋 째, 사용자에게 자원 접근의 편리성을 제공하기 위해서다. 사용자는 많은 종류의 다양한 자원들에 접근을 요구한다. 이때 사용자에게 일관적이고 단일화된 방식으로 사용자가 원하는 자원에 쉽게 접근하게 할 수 있는 것이 바로 분산 시스템이다. 예를 들어서 특정 인터넷 페이지가 있다고 가정해 보자. 우리는 이 페이지를 저장하고 있는 서버가 어디에 있으며 아이피가 무엇인지 알지 못한다. 하지만 인터넷 브라우저에 url을 입력하면 우리가 원하는 사이트에 접속하고, 우리가 원하는 정보를 얻을 수 있다. 여기서 url은 단일화된 자원 접근 방법이고, 앞에서도 말했다 싶이 사용자는 이 자원이 실제 세계 어떤 서버에 있는지에 대한 고민은 전혀 하지 않아도 된다.

위와 같은 특성들을 통틀어 투명성(Transparency)라고 한다.
사용자는 어디에 어떤 자원이 어떻게 저장되어 있는지 알필요 없고, 몇 대의 시스템이 어떻게 구성되어 돌아가는지 알 필요가 없다. 이런 투명성은 아래와 같이 여덟가지 항목에 적용해 볼수 있다.
 - Access : 데이터 표현 방식, 자원에 접근 방법을 사용자에게 숨긴다.
 - Location : 자원이 어디에 위치하고 있는지 사용자에게 숨긴다.
 - Migration : 자원의 이동을 사용자에게 숨긴다(이동하더라도 동일한 방법으로 접근 할 수 있음을 의미한다)
 - Relocation : 사용자가 사용 중임에도 자원이 이동 할 수 있다. 하지만 이 사실을 사용자에게 숨긴다.
 - Replication : 자원은 복사 될 수 있다. 하지만 사용자는 자기가 복사본에 접근하는지, 원본에 접근하는지 모른다.
 - Concurrency : 접근 자원이 다른 사용자와 함께 공유되고 있어도 사용자는 모른다.
 - Persistance : 자원이 메모리에 있든, 하드디스크에 있든 사용자는 모른다.

위와 같은 투명성을 제공하여 머신 자원 부족과 장애 대처, 사용자에게 자원에 대한 접근 편리성을 제공하는 것이 분산 시스템의 목적이라고 할 수 있겠다.

..라고 책을 보고 나름 생각한 것을 주장한 것이라 꼭 이게 맞다고는 말 못하겠다...;;

 
저작자 표시 비영리 동일 조건 변경 허락
Posted by kukuta

트랙백 주소 : http://kukuta.tistory.com/trackback/156 관련글 쓰기

댓글을 달아 주세요

TCP 소켓에는 총 11가지의 상태가 있고(netstat를 이용해 소켓의 상태를 보면 CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, CLOSE_WAIT, LAST_ACK, FIN_WAIT1, FIN_WAIT2, CLOSING, TIME_WAIT..중에 하나가 나온다) 그 중 사람들이 자주 헷갈리는 것이 TIME_WAIT와 CLOSE_WAIT는 요 두가지 상태이다.

오늘은 이 TIME_WAIT와 CLOSE_WAIT, 요 두 상태에 대해 말해 보도록 하겠다.

들어가기에 앞서, 용어 정리를 먼저 하도록 하자.

  • Active Open : connect()를 호출 하는 쪽. 즉, SYN 세그먼트를 전송한 쪽. 종종 클라이언트가 된다.
    하지만  100% 클라이언트라고 할 수는 없다.
  • Passive Open : accept()를 호출 하는 쪽. 일반적으로 서버의 역할이다. 이 역시 100% 서버라고 단정지을 수는 없다.
  • Active Close : close()를 처음 호출 한 쪽. 즉 FIN 세그먼트를 전송 한쪽. 클라이언트, 서버 관계 없이 어느 쪽이든 다 active close를 할 수 있다
  • Passive Close : FIN 세그먼트를 받은 쪽.
  • MSL : maximum segment lifetime, 세그먼트가 네트워크내에서 폐기 되기 전까지 살아남을 수 있는 시간

Active Close를 하는 쪽(close() 함수를 호출한 쪽)은 TIME_WAIT상태가 되며, Passive Close 를 하는 쪽(FIN을 수신한 쪽)은 CLOSE_WAIT 상태가 된다. 아래 그림에서 A는 Active Close, B는 Passive Close를 하는 쪽이다 :

※ active close, passive close에 서버, 클라이언트 구분이 없는 것에 대해 주목하자.

TIME_WAIT 상태... 뭐할려고 있는가?
1. Active Close하는 쪽의 마지막 ACK가 소실 되었을 때, Passive Close하는 쪽은 자신이 보낸 FIN에 대한 응답을 받지 못했으므로 FIN(SEQ:6001, ACK:5001)을 재전송한다. 이 때 TCP는 connection 정보(주소와 포트)를 유지하고 있고, 이런 이유로 RST(에러라고 처리되는 세그먼트) 대신 ACK를 다시 보낼수가 있다.

2. 확률이 극도로 희박하긴 하지만 네트워크를 방황하던, Passive Close하는 쪽에서 보낸 중복된 FIN 메시지가 나중에 다시 생긴 connection에 영향을 주는 것을 방지하기 위해서 TIME_WAIT 상태를 2MSL 동안 유지한다.

그럼 CLOSE_WAIT 상태는?
CLOSE_WAIT는 Passive Close하는 쪽(FIN을 받는 쪽)에서 프로그램이 소켓을 종료 시키는 것을 기다리기위한 상태이다. 프로그래밍 관점에서 말하면, recv byte가 0으로 연결이 끊어 졌으나 close() 함수가 호출 되지 않은 상태라고 생각하면 된다.
TCP connection은 close() 함수가 명시적으로 호출되지 않으면 CLOSE_WAIT 상태에서 영원히 멈춰 있을 수 있고 이것은 자원 누수로 이어진다. 소켓 사용하고 나면 close()를 명시적으로 호출 해 주어야만 한다.

ref.
 - A Word on TIME_WAIT and CLOSE_WAIT 
 -
소켓 종료와 TIME_WAIT(Socket termination and TIME_WAIT)
 - TIME_WAIT state vs SO_REUSEADDR option

저작자 표시 비영리 동일 조건 변경 허락
Posted by kukuta
TAG socket

트랙백 주소 : http://kukuta.tistory.com/trackback/155 관련글 쓰기

댓글을 달아 주세요

  1. Favicon of http://devbear.tistory.com BlogIcon devJun 2011/09/26 19:49  댓글주소  수정/삭제  댓글쓰기

    좋은글 보고갑니다~ 담아가도 되겠죠~~??? ㅎㅎ

  2. 하드코어 2011/10/19 11:07  댓글주소  수정/삭제  댓글쓰기

    좋으네요... 오늘도 레벨업됬습니다..

1. ACL이 중요한 이유는?

ACL(Access Control List)은  개개의 사용자들이 디렉토리나 파일과 같은 특정 시스템 개체에 접근할 수 있는 권한을 설정해 놓은 표이다.

  • 공격자(해커)가 리소스에 접근 할 수 있다면 게임 끝이다.
    • “만약 레지스트리키의 ACL이 Everyone에게 모든 권한 허용으로 설정 되어 있으면, 누구나 해당 레지스트리의 키 데이터를 읽고, 쓰고 심지어는 다른 사람의 접근을 차단 할 수 있다
  • ACL을 이용해 리소스에 대한 접근 권한을 설정 해 두지 않으면 예측하지 못한 다양한 방법 공격이 가능하다.
    ex) 64byte 로 지정된 버퍼에 더 많은 데이터를 써버려 오버런 발생
         대량의 데이터를 읽고 쓰게 강제
2. ACL의 구성
ACE(Access Control Entry) 란?
ACL의 구성 요소. ACL은 0개 혹은 이상의 ACE들을 가질 수 있고, 각 ACE들은 특정 자원에 대한 접근을 제어하거나 모니터링 할 수 있다.

  • Windows NT, 2000, XP와 이후 버젼에서 지원
  • 95, 98, Me, CE는 ACL을 지원하지 않음
  • NT와 이후 버젼 OS에서는 DACL, SACL 두 가지 지원
    • DACL(Discretionary Access Control List) - 접근 권한 결정
    • SACL(System Access Control List) - 감사 정책 결정
    • 둘은 비슷해 보이나 DACL은 권한을 설정하는 역할. SACL은 파일이나 폴더 혹은 주변 기기 오브젝트에 접근하는 이벤트 발생시 기록(log)을 할 수있음
  • DACL로 접근 권한을 제어 하거나, SACL로 감사 할 수 있는 보안 리소스의 예
    http://technet.microsoft.com/ko-kr/library/bb795082.aspx 참고
  • DACL
    • 각 DACL들은 0개 혹은 그 이상의 ACE(Access Control Entry)들로 구성 됨.
    • ACE는 SID(Security ID)와 SID가 리소스에 대해 가능한 작업들의 설명.
      두 가지 주요 요소로 구성 된다(그 외에도 여러 요소들이 있다).
    • SID - 사용자, 그룹, 컴퓨터를 나타내는 아이디
    • 거부 ACE - 특정 접근 권한을 거부하는 ACE
      ex) Everyone에 대해 모든 권한을 거부(owner 빼고 심지어 관리자 조차도 접근 불가)
      ACL은 항상 거부 ACE로 시작한다. 그렇지 않으면 허용 접근 권한이 지정되지 않는다.
3. 적적한 ACE 선택 방법?

ACL 내의 모든 ACE는 반드시 의미가 있다 - 의미를 모르겠다면 제거한다.


  1. 사용할 리소스가 무엇인지 결정
  2. 비즈니스에서 정의된 접근 요구 사항을 결정
  3. 적합한 접근 제어 기술을 선택한다.
  4. 접근 요구사항을 접근 제어 기술로 변환한다.

“주체(subject)는 대상 개체(Object)에게 어떤 행동을 수행할 수 있다”



4. ACL 생성

  • Window NT 4에서 ACL 생성
    • EXPLICIT_ACCESS
    • AllocateAndInitializeSid()
    • InitailizeSecurityDescripter()
    • SetSecurityDescriptorDacl(),
      SetSecurityDescriptorOwner(),
      SetSecurityDescriptorGroup(),
      SetSecurityDescriptorSacl()
  • Windows 2000에서 ACL 생성
    • SDDL(Security Descriptor Definition Language) 사용

5. ACE 권한 지정 순서
거부 ACE가 다른 ACE 보다 먼저 지정되어야 한다(이렇게 하지 않으면 허용 접근 권한이 지정되지 않는다)

  1. 명시적 거부
  2. 명시적 허용
  3. 부모 컨테이너에서 상속된 거부
  4. 부모 컨테이너에서 상속된 허용....
6. NULL DACL과 그 밖의 위험한 ACE

NULL DACL == 방어하지 않는다


  • Everyone(WRITE_DAC)
    오브젝트의 DACL을 변경할 수 있는 권한. 공격자가 SD에 기술된 ACL 변경으로 자신만 해당 오브젝트에 접근하고 다른 사람은 거부하도록 만들 수 있다.
  • Everyone(WRITE_ONWER)
    오브젝트의 소유자를 변경할 수 있는 권한. 공격자가 SD에 기술된 오브젝트 소유자를 변경해 버릴 수 있다.
  • Everyone(FILE_ADD_FILE)
    공격자가 새로운 실행 파일을 파일 시스템에 추가 할 수 있다.
  • Everyone(DELETE)
    누구나 오브젝트를 삭제 가능하다
  • Everyone(FILE_DELETE_CHILD)
    공격자가 디렉토리에 FILE_DELETE_CHILD 권한을 가지면, 차일드 오브젝트에 대한 권한관계 없이 삭제 가능하다.
  • Everyon(GENERIC_ALL)
    NULL DACL과 같다.

What Are SD(Security Descriptors) and Access Control Lists?
...security descriptors to help control access to the objects. Security descriptors include information about who owns an object, who can access it and in what way, and what types of access are audited. Security descriptors, in turn, contain the access control list (ACL) of an object,...
http://technet.microsoft.com/ko-kr/library/cc783702(WS.10).aspx
7. 운영체제에 포함되지 않는 기타 접근 권한 메커니즘
  • Net 프레임 워크 역할(role), COM+ 역할
    ※ 역할이란 정책을 강제하기 위해 애플리케이션에서 사용.
       예를 들면 그룹을 지정하고 해당 그룹에 허용되는 트랜젝션들을 정의(애플리케이션 종속적)
  • IP제한
  • SQL 서버의 트리거와 SQL 서버의 사용 권한
    업데이트시 그룹을 검사하여 적절한 권한의 그룹이 아닌 경우 롤백을 구동하는 트리거
저작자 표시 비영리 동일 조건 변경 허락
Posted by kukuta

트랙백 주소 : http://kukuta.tistory.com/trackback/154 관련글 쓰기

댓글을 달아 주세요