12월, 2019의 게시물 표시

논문 리뷰:Big Data Analytics Technologies and Platforms

이미지
Big Data Technologies 오류에 대한 대처 능력, 확장성, 탄력성, 분산 구조, 형식에 포괄적인 저장 공간, 큰 양의 데이터 처리가 필요하다(fault tolerance, scalability, elasticity, distributed architecture, generic storage, processing of large volumes of data). Big Data Technologies Introduction Apache Hadoop/YARN 많은 호스트 서버들에서 연산 프로세스를 쪼개서 할 수 있게 하는 open-source computation framework이다. MapReduce라는 execution engine과 HDFS라는 파일 시스템이라는 두 주요 구성이 있다. 많은 양의 structured 또는 unstructured 데이터를 처리하는 데에 있어 높은 유연성, 확장성, 낮은 코스트, 그리고 reliability를 제공한다. 데이터, 리소스, 태스크의 로드를 균형있게 하는 job schedule도 제공한다. Hadoop이 YARN(Yet Another Resource Negotiator)로 발전됐다. YARN은 프로그래밍 모델을 리소스 관리로부터 분리하고 스케쥴링 function들을 각 애플리케이션에 위임했다. Apache Spark 분산 데이터 처리를 위한 unified engine이다. MapReduce와 비슷한 프로그래밍 모델을 갖고 있지만 RDD(Resilient Distributed Datasets)라는 data-sharing abstraction으로 확장을 했다. SQL, streaming, 머신러닝, 그래프 프로세싱 등 각각의 엔진이 필요했지만 RDD로의 확장을 통해서 넓은 범위의 프로세싱 workload를 capture할 수 있게 됐다. In-memory 연산을 통해서 데이터가 메모리에 캐싱되게 하고, 따라서 반복적인 작업에서 생겼던 YARN의...

Tree / Binary Search Tree

Find Minimum Depth of a Binary Tree Recursive하게 탐색을 하는데 현재 노드가 leaf 노드라면 1을 리턴한다. 그게 아니고 왼쪽 자식이 없고 오른쪽만 있으면 오른쪽에서 받은 recursion+1을 리턴한다. 반대의 경우도 마찬가지로 한다. 마지막으로 양쪽 자식이 다 있으면 그중 양쪽 recursion의 최솟값을 리턴한다. Maximum Path Sum in a Binary Tree 아무 노드에서부터 아무 노드까지의 path를 봤을 때 그 노드들이 갖고 있는 값들의 합이 최대가 되도록 해야 한다. 음의 값도 가질 수 있다. 루트부터 자식 노드들로 recursive하게 진행을 한다. 각 노드에서 가질 수 있는 경우는 네 가지이다. 지금 노드만 갖고 있는 경우, 지금 노드와 왼쪽 recursion의 합인 경우, 지금 노드와 오른쪽 recursion의 합인 경우, 지금 노드와 양쪽 recursion의 합인 경우 이렇게 네 가지 이다. 이 네 가지 중 최댓값 myResult를 구한 뒤, global variable인 result에 result = max(result, myResult)를 저장해주면서 업데이트한다. Check If a Given Array Can Represent Preorder Traversal of Binary Search Tree 각 노드에 대해 타당성을 확인한다. 지금 index의 값을 기준으로, 오른쪽 subarray를 봤을 때 자기보다 큰 값이 있으면, 그 이후에는 자기보다 작은 게 나오면 안된다. n제곱 알고리즘이지만 stack을 활용하면 n알고리즘으로 만들 수 있다. https://www.geeksforgeeks.org/check-if-a-given-array-can-represent-preorder-traversal-of-binary-search-tree/ Check Whether a Binary Tree Is a Full Binary Tree or Not Fu...

기타

class vs object class가 그 자체로 선언되면 object이고, 그 object를 실체화시키면 instance가 되어 메모리에 할당된다. public class Animal{ // class    //....... } int main(){     Animal cat;  //object     cat = new Animal();  //instance } overloading vs overriding overloading: 두 메서드가 같은 이름을 갖고 있으나 인자의 수나 자료형이 다른 경우이다. overriding: 상위 클래스의 메서드와 이름과 용례가 같은 함수를 하위 클래스에 재정의 한 것이다. 개발자의 실수를 방지하기 위해 @Override라는 annotation을 쓴다. Garbage Collector Java에서는 GC라는 알고리즘을 통해 메모리가 관리되기 때문에 개발자가 메모리를 처리하기 위한 로직을 만들 필요가 없다. 안드로이드 액티비티 생애주기 onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy() onCreate: 처음 실행할 때만 호출된다. 변수 초기화 및 클래스의 인스턴스화를 한다. 위젯에 대한 id를 참조하는 등의 작업을 한다. onStart: 액티비티가 포그라운드로 나오기 위해 수행되는 단계이다. BroadcastReceiver를 등록하는 등의 작업을 한다. onResume: 현재 실행중인 액티비티에 포커스가 맞춰져 있는 동안 onResume의 상태를 유지한다. 포커스가 다른 곳으로 이동되면 onResume의 상태가 꺼지고 종료되지 않은 상태에서 다시 포커스가 돌아오면 onPause를 거쳐 onResume이 된다. onPause: 액티비티의 포커스가 다른 곳으로 이동했을 때 호출된다. 액티비티가 백그라운드에 있다는 뜻이며 개발자가 상황에 따...

OSI 7 Layer

이미지
OSI 7 layer 네트워크에서 통신이 일어나는 과정을 나눈 것이다. 1. 물리계층 통신 단위는 비트이며 단지 데이터를 전달만 할 뿐 전송하는 데이터가 무엇인지 에러가 있는지 신경쓰지 않는다. 통신케이블, 리피터, 허브 등이 있다. 2. 데이터링크 계층 물리 계층을 통해 송수신되는 정보의 안전한 전달을 도와준다. 물리 계층에서 발생할 수 있는 오류에 대한 처리가 일어나고 재전송이 가능하다. 맥 주소를 가지고 통신한다. 네트워크 카드가 만들어질 때부터 맥 주소가 정해져 있다. 전송 단위는 프레임이다. 브리지, 스위치 등이 있다. 3. 네트워크 계층 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능(라우팅)을 한다. 네트워크 관리자가 직접 할당하는 논리적인 주소 구조(IP)를 가지며 계층적이다. 4. 전송 계층 통신을 활성화하기 위한 계층으로 보통 TCP 프로토콜을 사용한다. 포트를 열어서 응용 프로그램들이 전송을 할 수 있게 한다. 패킷들의 전송이 유효한지 확인하고 실패한 패킷들을 다시 전송한다. end-to-end 통신을 이루는 최하위 계층이고 오류 검출 및 복구와 흐름제어 중복 검사 등을 수행한다. 패킷을 만들고 전송한다. 5. 세션 계층 세션은 데이터가 통신하기 위한 논리적인 연결이다. 4계층에서도 연결을 맺고 종료할 수 있다. 동시 송수신 방식, 반이중 방식, 전이중 방식 등을 수행한다. TCP/IP 세션을 만들고 없앤다. 6. 표현 계층 데이터 표현이 상이한 응용 프로세스의 독립성을 제공하고 암호화한다. MIME 인코딩이나 암호화 등의 동작이 이 계층에서 이루어진다. 해당 데이터가 text인지 gif인지 jpg인지 등의 구분이 이 계층에서 이루어진다. 사용자의 명령어를 완성 및 결과 표현/포장/압축/암호화를 한다. 7. 응용 계층 최종 목적지로서 HTTP, FTP, SMTP, POP3, IMAP, Telnet등의 프로토콜이 있다. 응용 프로세스와 직접 곤계하여 일반적인 응용 서...

Fuzzing으로 Apache에서 Race Condition 찾기

이미지
Fuzzing 자동화 혹은 반자동화된 소프트웨어 테스트 기법이다. 컴퓨터 프로그램에 무작위의 데이터를 입력하고, 그 결과에 대해 모니터링 함으로써 버그를 찾는다. Mutation-based: 샘플 입력을 변형하여 테스트 데이터를 만든다. 비트 플립이나 비트를 추가하는 등의 기법을 이용한다. Generation-based: 파일의 형식이나 프로토콜을 이해하고 그것에 맞추어 적절한 입력을 생성한다. Fuzzotron TCP/UDP 기반의 네트워크 퍼징 툴이다. radamsa라는 툴이 mutation-based 테스트 데이터를 만들어준다. Thread Sanitizer C/C++ 기반 data race를 찾아주는 도구이다. Constant global에 대한 read operation이나 현재의 쓰레드를 벗어나지 않는 메모리 접근인 경우, 혹은 두 쓰레드가 접근하는데 하나가 read이고 다른 하나가 write라도 read가 항상 먼저 일어나는 경우를 제외하고의 모든 memory access가 기록된다. 실험 디자인 Apache 2.4.7의 소스코드를 받아서 CFLAGS="-fsanitize=thread -pthread -fPIC -g" ./configure --enable-threads --with-mpm=worker --enable-mods-shared=reallyall --with-included-apr --prefix=/LOCATION/ 의 옵션으로 configure한다. --with-mpm=worker 옵션으로 한 자식 프로세스당 여러 thread를 가질 수 있도록 하고, thread sanitizer를 붙인다. 그 뒤 prefix위치에 빌드된 디렉토리에서 /conf/httpd.conf에서 SetHandler server-status ExtendedStatus On 을 추가해준다. 이 설정은 서버상태의 모니터링을할 때 자세한 상태정보기능을 제공하도록 해준다. 그리고 /conf/extra/http...

Database

ACID (Atomicity, Consistency, Isolation, Durability) 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질이다. Atomicity: 트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되면 안된다. 이체를 할 때 송금자에게서는 돈이 빠졌지만 그 상태에서 멈춰서 수신자에게 돈이 안들어 갔다면 전체 트랜잭션이 취소되어야 한다. Consistency: 트랜잭션 후에도 데이터베이스가 제약 조건을 만족해야 한다. Isolation: 트랜잭션 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못한다. Durability: 성공한 트랜잭션은 데이터베이스에 반영이 되고 그 반영이 의도와 다르게 되돌려 지지 않아야 한다. DBMS (Database Management System) 데이터들을 일정 단위로 저장하고 유지보수 하는 시스템 CRUD: Create, Retrieve, Update, Delete 대부분은 R이 압도적으로 많기 때문에 효율적인 검색을 위한 디자인이 필요하다. 이진탐색 or B-Tree RDBMS 란 관계형 DBMS로서 테이블 기반으로 저장이 된다. 테이블과 테이블 간의 연관관계를 통해 정보를 찾는다. 병렬 DBMS 는 다중 중앙 처리 장치로 디스크를 병렬로 사용함으로써 처리 및 입출력 속도를 높인다. MPP구조를 하고 있는 경우가 많다. MPP(Massively Parallel Processing) 에서는 존재하는 processor가 각각 전용의 메모리를 갖추어 동작한다. 메모리를 공유하지 않기 때문에 shared nothing architecture라고도 한다. 메모리에서의 접근 충돌이 일어나지 않고 lock manager가 불필요하다. 프로세스의 수가 많아지면 오버헤드가 커져서 시간이 느려진다. SMP(Symmetric Multi Processing) 에서는 모든 processor가 공통의 메모리를 이용하며 동작한다. 효율이 좋은 병렬 처리를 할 수 있다...

Hadoop HDFS & MapReduce Review

이미지
빅데이터의 특성: 3v - Volume, Velocity, Variety cluster: 네트워크에서 시스템 간의 연결된 묶음 commodity hardware: cluster를 만들 수 있는 PC node: 네트워크 장치를 통해 서로 연결된 commodity server -------------------------------------------------------------------------------------------------------------------- HDFS(Hadoop Distributed File System)  데이터를 데이터 블록으로 나눠서 저장하는데 각 데이터 블록에 대해 복사본을 만들어서 안정성을 높인다. - 특징 일반 file system에 비해 데이터 블록의 크기가 크다. 128MB 반응 속도 보다는 시간당 처리량에 최적화 되어 있다. 한 번 쓰고 수정 없이 여러 번 읽는 모델에 적합하다. 자료가 워낙 크니까 계산 할 때 자료를 불러오기 보다는 계산 작업을 자료가 있는 곳에 가서 한다(데이터 지역성) - 구성 하나의 네임노드, 세커더리노드와 다수의 데이터노드가 있다. 네임노드에는 블록 정보가 담겨 있는 Fsimage 파일, 파일의 생성 삭제에 대한 트랜잭션 로그, 메모리에 저장하다가 주기적으로 생성되는 Edits 파일이 있다. 세컨더리노드가 Fsimage와 Edits 파일을 주기적으로 머지해서 Edits 파일을 삭제하기 때문에 디스크 부족 문제를 해결한다. 하나의 블록은 3개로 복제되며 각각 다른 노드에 분산 저장된다. 데이터노드는 네임노드로 주기적으로(6시간) 블록의 정보를 전송하고(블록리포트) 이를 통해 최신 정보를 유지한다. 데이터노드는 주기적으로(3초) 하트비트를 보내고, 하트비트가 없으면 데이터노드가 동작하지 않는 것으로 간주하고 I/O가 발생하지 않도록 한다. - 저장 프로세스   애플리케이션이 본인의 HDFS 클라이언트를 통해 네임...

Linked List

Add Two Numbers Represented as Linked Lists 두 리스트의 길이를 계산한다. 길이가 같으면 recursion을 이용한다. 가장 오른쪽 노드에 도달할 때 까지 모든 노드를 recursion stack에 넣어 놓는다. 맨 오른쪽부터 합을 계산해서 carry를 왼쪽 노드로 전달한다. 길이가 다르면 긴 걸 차이만큼 오른쪽으로 이동해서 계산한다. Merge Sort for Linked Lists 매 merge 작업마다 fast & slow runner를 이용해서 중간 지점을 찾는다. 그래서 앞 절반하고 뒤 절반으로 나눠서 recursive하게 작업한다. base case는 길이가 0이나 1일 때로 한다. 그 다음에 나눠진 것들을 합치면서 recursion을 빠져나오는데 그때는 맨 처음 원소는 두 헤드 중 작은 원소를 넣고 그 다음 원소는 recursive하게 붙인다. https://www.geeksforgeeks.org/merge-sort-for-linked-list/ Detect and Remove Loop in a Linked List 첫번째 방법: fast & slow runner를 만들어서 만날 때 까지 탐색을 한다. 만나는 지점을 찾으면 그 곳을 기준으로 잡는다. 다시 리스트의 처음부터 보는데 각 노드마다 기준 노드에서 접근이 가능한지를 본다. 처음으로 기준 노드에서 접근이 가능해지는 곳이 사이클이 시작되는 곳이다. 두번째 방법: 위와 같이 일단 만나는 지점을 찾고 그때부터 하나는 헤드부터 하나는 만나는 지점부터 해서 한 칸씩 이동한다. 둘이 만나는 곳이 루프의 시작이다. 세번째 방법: 각 노드의 주소를 해시 맵에 저장해서 기존에 방문했었는지를 확인한다. Select a Random Node from a Singly Linked List 첫번째 방법: 리스트를 돌면서 전체 길이를 알아낸다. 그중 랜덤하게 index를 뽑아서 그 리스트를 반환한다. 두번째...

Network

ssh(secure shell) 원격 제어 클라이언트와 서버가 있다. 클라이언트에는 ssh client가 있어야 하고 서버에는 ssh server가 있어야 한다. 클라이언트에서 rm과 같은 명령을 보내면 ssh server가 자기가 설치돼있는 컴퓨터에게 명령을 전달하고, 그 컴퓨터는 그 명령을 하고 결과를 ssh server에 보낸다. 그러면 다시 ssh client에게 결과를 전달해준다. Port 웹은 80, ssh는 22번 포트를 사용한다. 모든 컴퓨터에는 포트가 있다. 0부터 65000까지가 있다. 클라이언트 웹브라우저에서 웹서버에 접속할 때 기본적으로 80번 포트로 접속을 한다. naver.com이라고 치면 자연스럽게 naver.com:80으로 접속하는 것이다. 웹서버는 요청을 처리하고 마찬가지로 80번 포트로 전해준다. 1024까지의 포트는 well-known port이다. 고정된 포트 번호이다. 그 나머지의 포트는 사용자가 임의로 정해서 쓴다. 만약 웹서버의 포트번호를 80이 아니라 8888로 하면 naver.com:8888로 해줘야만 들어갈 수 있다. Port Forwarding ISP(Internet Service Provider)에서 인터넷을 받아서 라우터(공유기)를 통해 집 안 각각의 컴퓨터들이 연결된다. ISP에서 public IP가 들어온다. 그 IP는 라우터의 IP가 된다. 그 라우터에 연결된 각각의 컴퓨터들은 또 고유한 private IP address를 받게 된다. Public IP는 외부에서도 그 IP를 알고 있으면 접근이 가능하다. Private IP는 외부에 공개되지 않는 IP이기 때문에 그 아이피만 갖고는 접속이 안된다. 포트 포워딩: 사용자가 라우터에 9000번 포트로 접근을 하면 그 포트는 라우터에 연결된 컴퓨터 중 하나로 연결되도록 라우터를 설정할 수 있다. router IP는 환결설정 tcp/ip 칸이나 어딘가에 나와있다. 192.168.0.1 라우터 ip에 접속하면 공유기 ...

Data Structures for Disjoint Sets

각각 다른 원소들을 서로 겹치지 않는 집합으로 나눈다. 각 set에서 그 set에 포함된 원소 중 하나가 대표를 맡는다. union & find 의 기능이 있다. n개의 원소가 있을 때 맨 처음에 n번의 make-set을 한다. 그다음부터는 union을 할 때마다 set의 수를 하나씩 감소시키므로 union은 최대 n-1번 할 수 있다. Linked-list를 이용한 구현 각각의 원소들은 그 원소가 포함된 set의 대표에도 연결돼있고 next node도 가리킨다. make-set은 그냥 하나의 list를 만드는 거니까 O(1)의 시간이 걸린다. find-set은 대표 포인터를 반환하므로 O(1)이 걸린다. union은 첫번째의 tail을 두번째의 head와 연결하면 되지만 합쳐지는 list에서 대표로 가는 포인터를 업데이트 해야 하므로 linear time만큼 걸린다. 따라서 n번의 make-set과 n-1번의 union을 하면 O(N^2)이 걸린다. Weighted-Union Heuristic 단순히 첫번째꺼에 두번째꺼를 연결하는 것이 아니라 각 리스트의 길이를 알고 있어서 짧은 리스트를 긴 리스트에 연결한다. Forest 방식의 구현 각 멤버는 자기의 부모만 가리킨다. 각 트리가 하나의 set이고 각 루트는 대표이다. 대표는 부모 대신 자기 자신을 가리킨다. make-set은 하나의 노드가 있는 트리를 만드는 것이다. find-set은 그 트리의 높이만큼 시간이 걸린다. union에서 시간이 절약된다. 단순히 한 트리의 루트가 다른 트리의 루트를 가리키면 된다. Union by Rank union 할 때 작은 rank를 갖고 있는 루트가 큰 rank를 갖고 있는 루트를 가리키도록 한다. Path Compression find를 하고 나면 그 원소가 원래는 부모를 따라서 루트로 올라가야 했는데 루트까지 올라갔으므로 부모를 바로 루트로 설정한다.

Graph

Breath First Search(BFS) for a Graph 트리에서의 Breath First Traversal과 비슷하지만 그래프에는 사이클이 있을 수 있다. 따라서 중복된 방문을 피하기 위해 visited라는 boolean array를 이용한다. 탐색해야 할 노드들이 저장된 큐를 만들고, 큐에 넣을 때마다 그 들어간 노드의 visited를 true로 한다. 그다음 큐가 빌 때까지 맨 앞의 노드를 뽑아내서 그 인접한 노드들을 탐색하며 !visited인 노드들을 큐에 넣으면서 visited = true로 바꾼다. Depth First Search(DFS) for a Graph 마찬가지로 visited array가 필요하다. Recursive하게 돌면서 visited array를 계속 넘겨준다. 하나의 recursion에서는 노드와 visited array를 받는데 그 노드를 visited로 바꾸고 그 인접 노드들 중에 unvisited가 있으면 그 노드에 대해 recursion함수를 부른다. Shortest Path from Source to All Vertices: Dijkstra Prim's algorithm for minimum spanning tree와 비슷하다. 한 set을 만든다. 최단 셋을 의미한다. 각 vertex마다 distance를 정의하고 출발점은 0, 나머지는 무한대로 설정한다. set에 없으면서 가장 작은 distance를 갖고 있는 vertex u를 찾은 뒤 set에 넣는다. 그 u의 모든 인접 vertex의 distance를 업데이트한다. u의 distance와 그 사이 edge의 distance를 합한 것을 인접 vertex가 갖고 있던 기존의 distance와 비교해서 작은 값으로 바꾼다. 이 과정을 set가 모든 vertex를 포함하기 전까지 반복한다. Negative edge가 있을 때는 Bellman-Ford algorithm이다. Shortest Path from Eve...

Apache Race Bug Review (CVE-2014-0226)

이미지
아파치 2.4.7 버전에서 발견된 race 버그이다. scoreboard: 부모와 자식 간에 소통하는 파일 scoreboard와 mod_status 를 업데이트 할 때 생기는 race condition이다. htaccess credential, ssl certificate private key 등을 노출시킬 수 있는 힙 버퍼 오버플로우를 유발할 수 있는 심각한 버그이다. 세팅 아파치는 MPM event 혹은 MPM worker로 컴파일 돼야 한다. ./configure --enable-mods-shared=reallyall --with-included-apr httpd.conf에서 mod_status의 configuration에 SetHandler server-status ExtendedStatus On 설정을 해준다. 이 설정은 서버상태의 모니터링을 할 때 자세한 상태 정보 제공을 가능하게 한다. 버그 동작 분석 server/util.c파일의 1908 line ap_escape_logitem 함수에서 문자열의 포인터str을 받는다. 그 포인터를 다른 문자열 포인터s로 복사한 뒤 문자열 끝까지 가면서 escape돼야 할 문자의 수를 센다. 1907 AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str) 1908 { 1909     char *ret; 1910     unsigned char *d; 1911     const unsigned char *s; 1912     apr_size_t length, escapes = 0; 1913 1914     if (!str) { 1915         return NULL; 1916     } ...

Apache MPM(Multi-Processing Modules) - Prefork & Worker

이미지
Apache MPM: 아파치 서버가 클라이언트의 요청을 자식 프로세스들에게 분배하는 모듈이다. 동접자수가 많거나 확장성이 필요한 사이트는 worker 방식을 택하고, 안정성과 오래된 소프트웨어와 호환성이 필요한 사이트는 prefork 방식을 사용한다. /docs/conf/extra/httpd-mpm.conf파일에서 각 모듈에 대한 설정을 바꿀 수 있다. Prefork 실행 중인 프로세스를 메모리 영역까지 미리 복제해서 준비한다. 자식 프로세스가 각각 하나의 스레드를 가지며 자식 프로세스는 총 1024개를 가질 수 있다. 스레드 간 메모리 공유가 없어서 안정적이지만 메모리가 많이 필요하다. 응답 프로세스를 미리 띄워놓고 클라이언트 요청 시 자식 프로세스가 반응한다. 몇몇 idle process가 유지돼있으므로 요청이 들어오면 바로 처리하여 빠르지만 동시에 많은 접속이 들어오면 많은 자원을 쓰게 된다. 싱글 CPU 혹은 듀얼 CPU에서 성능이 좋다. 안전하지 않은 제 3자가 만든 모듈을 사용할 수 있고, 디버깅이 빈약한 플랫폼에서 쉽게 디버깅 할 수 있다. StartServers : 아파치 시작시 생성되는 기본 프로세스 개수 MinSpareServers : 최소 프로세스의 개수 MaxSpareServers : 최대 프로세스의 개수 MaxClients : 아파치 시작시 최대로 실행할 자식프로세스의 개수 MaxRequestWorkers : 동시에 처리할 수 있는 최대 연결 수(기본적으로는 256까지 사용가능하며, 컴파일 전에 파일을 수정(./server/mpm/prefork/prefork.c)하면 1024까지 올릴 수 있다.) MaxConnectionsPerChild : 서버 프로세스가 종료되기 전에 제공되는 최대 연결 수입니다. 0의 경우 제한이 없다라는 의미다. Worker Prefork보다 메모리 사용량이 적기 때문에 동시 접속자가 많고 통신량이 많은 서버에 적절하다. 프로세스당 최대 64개의 스레드 처리가 가능하고...

Apache HTTP Server Basic

Client가 요청하면 Server는 응답한다. 웹에 적용하면 클라이언트는 웹브라우저이고 서버는 웹서버이다. 여기서 웹브라우저에 크롬, 익스플로러 등이 있고, 웹서버에는 아파치, 엔진엑스 등이 있다. 웹브라우저가 웹서버에 접속하려면 도메인과 아이피가 필요하다. sudo apt install apache2 sudo service apache2 start sudo service apache2 stop ip addr하면 내 아이피를 알 수 있다(ip addr은 private IP가 나오고 curl은 public ip가 나온다). 라우터를 통해 연결되면 private ip와 public ip는 다르다. 그러면 기본적으로는 서버가 될 수 없고 클라이언트만 될 수 있는데, 라우터를 통해 연결된 컴퓨터끼리는 통신이 가능하고, 라우터의 도움을 받아서 서버컴퓨터의 역할을 할 수도 있다. elinks http://myIP 하면 내 컴퓨터가 서버컴퓨터로 동작하는 웹서버에 접속하게 된다. elinks가 웹브라우저이다. 아니면 그냥 브라우저에서 주소창에 아이피 주소를 쳐도 된다. 지금의 상황에서는 컴퓨터 한대 안에서 웹브라우저 웹서버를 따로 만들어서 통신을 하는데 이때는 localhost를 쓸 수 있다. localhost = 127.0.0.1 웹브라우저에서 http://IP/File의 요청을 하면 그 IP에 해당하는 서버컴퓨터로 간 뒤 웹서버에서 특정 디렉토리에서 FILE을 읽어서 웹브라우저에게 응답한다. 그러면 웹브라우저는 그 파일을 읽고 해석한 뒤 출력하면 과정이 끝난다. --------------------------------- Configuration 유닉스에서는 /etc에서 여러 프로그램의 동작 방법이 저장되어있다. apache2.conf파일을 열어보면 설정파일에 대한 설명들이 있다. 웹서버에서 파일들이 저장되어 있는 위치는 코드들을 보면 알 수 있다. 서버컴퓨터는 요청이 왔을 때 /etc/apache2의 설정파일을 참고해서 ...

Software Security2

이미지
Side Channel Attack Physical implementation에서 얻은 정보로 공격한다. Brute force나 theoretical weakness가 아니라 전자장치에서 암호 알고리즘 수행 시 전력 소모, 전자기파 등 정보를 분석함으로써 공격한다. 인풋에 따라 leakage power가 달라지기도 하는데 이런걸 이용한다. 알고리즘 자체가 아니라 시스템을 공격하는 것이라서 알고리즘이 탄탄해도 상관 없다. 평범 동작을 분석하니까 흔적이 없고, 어떤 input을 넣고 에러를 분석할 수도 있다. 대응 방법으로는 무작위성기법(계산 실제값 유출을 방지하고 유출 정보 난수를 생성)이 있다. Cache Side Channel Attack Privilege를 무시한다. cross cpu, cross core. L3에서 지우면 모든 캐시에서 지워진다. TLB는 user와 kernel 사이에서 공유되고 context switching 때 flush되지 않는다 Resource-statistics: 메모리 사용을 보고 input이나 user action을 알아낸다. Row hammer: 동일한 메모리 row에 반복적으로 접근하면 인접 메모리에 전기 방해가 일어나서 bit flip이 일어나는 취약점이다. Covert-channel attack ------------------------------------------------------ Meltdown & Spectre Speculative Execution과 Indirect Branch Prediction 기술과 관련된 취약점이다. 정상적인 프로세스에서는 성능을 위해서 한 명령이 처리될 때 다음 수행 될 명령을 위한 데이터가 캐시에 미리 저장된다. 만약 잘못 예측을 했다면 해당 작업을 취소하고 전 단계로 돌아가지만 CPU 캐시에 로드해 놓았던 데이터들은 남아있다. Variant 1(CVE2017-5753), 2(CVE2017-5715)는 스펙터 취약점이고 Var...