티스토리 툴바


technology2011/12/12 16:41
간만에 네트웍 관련된 글이 있어서 소개합니다.
안랩 ASEC팀에서 작성한 글 입니다.

패킷 뜯어 보기! - WireShark 편 
와이어샤크를 통한 패킷 덤프(Packet Dump)
네트워크 상태 보기! - TCP View 편 (1)
악성코드 대응! - TCP View 편 (2)



저작자 표시
Posted by 승현아범
technology2011/08/26 11:25
PKI 시스템에서 가장 대표적인 기술이라면 아마도 인증서 관련된 내용일거다.
그 중에서도 가장 보편적으로 많이 사용되는거라면, 아마도 SSL/TLS 이지 않을까 싶다.
그런데, SSL 을 비롯한 PKI 문제를 너무 기술적인 접근만 이뤄지고 있는 것 같아서 그 기술적 배경에 대해서
간단히 정리를 하고자한다.

PKI는 Public Key Infrastructure 이다.
여기서 Infrastructure라는 단어가 중요한데, 보안/암호 시스템에서 가장 중요한 단어 하나를 꼽으라면,
주저없이 신뢰라는 단어를 꺼내고 싶다.
이 신뢰라는 단어는 기술적으로 강하게 묶이도록 시스템을 구성하지만, 그렇지 않은 경우도 존재하기 때문이다.
예를 들어서 Self Sign된 인증서로 SSL/TLS 서비스를 구성할 때, 웹브라우저는 해당 인증서를 신뢰하겠느냐고 물어본다.
이때는 기술적인 부분보다 사용자에게 웹사이트의 신뢰여부를 확인 받는것이다.

개발자들에게는 SSL/TLS(공인인증서 또한 마찬가지다) 시스템 구축시에 가장 많이 발생하는 오류가
Certificate chain 오류나 PKIX path building 오류이다.
인증서를 검증하면서 오류가 발생하는 것인데, 대부분 CA인증서를 신뢰하도록 설정하지 않아서 문제가 생기는 것들이다.
즉, 인증서는 그 인증서를 발급한 상위 기관(CA)이 있고, 그 상위기관의 인증서 또한 누군가에 의해서 발급이 된다.
그러다 최상위 기관의 인증서는 스스로 발급을 하고, 전자서명을 하는데 이는 Self Sign으로 처리된다.
이렇듯 각 인증서의 상/하 관계는 Chain으로 구성되어 있다.
하나의 인증서를 검증하기 위해서는 반드시 Certificate Chain도 함께 검증을 해야 그 신뢰관계가 형성되는 것이다.
그렇다면, 시스템에서 어떻게 Certificate Chain을 신뢰하도록 할까?
그건 여러 방법이 있겠지만, 그중에 하나가 Keystore를 만들고, 이를 신뢰하도록 설정하는 것이다.
Certificate Chain의 모든 신뢰관계를 갖는 인증서를 Keystore에 넣어두고, 해당 Keystore를 최종적으로 신뢰하도록 한다면,
최소한 우리가 가장 중요하다가 신뢰하는 인증서들을 안전하게 사용할 수 있다.
이후부터는 순수하게 기술적인 문제만이 존재한다.

또 하나 고려해야 할 사항이 있다면, 신뢰의 정도문제를 얘기할 수 있다.
절대적으로 신뢰할 수 있는 것인지, 현재의 시스템에서 적당히 신뢰할 수 있는것인지, ... 
이에 따라서 전체 시스템/서비스의 보안강도 또한 연관되어 결정될 수 있다.
좀 더 좋은 방법, 좀 더 귀찮지만 더 신뢰할 수 있다면 보안측면에서는 좀 더 향상된 시스템임에 분명하다.
(보안적인 측면과 편리성, 가용성, 접근성등은 상반된 입장으로 늘 부딪히기 마련이다.)

대부분의 개발자들이 보안시스템의 개념이나 키관리의 중요한 개념없이 무조건적인 기술개발만 집착을 하다보니
정작 가장 중요한 부분을 놓치는 경우가 왕왕있다.
다시 한번 강조하지만 보안/암호 시스템에서는 가장 중유한 것은 신뢰이며, 이 신뢰관계를 지속적으로 유지하는가가 그 어떤 것보다 중요하다.
많은 경우 신뢰관계를 쫓아가다보면 마지막 단계는 사람과 만나기도 하는데, 이것을 시스템/프로세스화 하도록 하는것이 좋은 시스템의 척도이지 않을까 싶다.

저작자 표시
Posted by 승현아범
TAG pki, SSL, tls, 인증서
매번 SSL 통신할 때마다 헷갈려서 이번에는 적어 놓는다...  (머리가 메모를 도저히 못 따라가는구나....)

I. 일반적인 웹서버 SSL 셋팅시
    -. 웹서버 또는 keytool, openssl 등을 통해서 개인키와 공개키를 생성한다. (keygen~)
        (자바에서는 keystore 생성도 포함)
    -. 생성된 공개키로 CSR 를 생성하고, 각 CA에게 전달
    -. CA로부터 전자서명된 인증서를 전달 받는다.
    -. 웹서버에 인증서와 개인키를 설정한다.
        개인키PEM으로 설정시에 간혹 PKCS#8 포맷 오류가 발생할 수 있다.
        이때 OpenSSL 사이트의 Example 참고
    -. 서버 인증서 뿐만 아니라 CA키도 함께 설정해야 한다.
    -. 개인키와 인증서를 PKCS#12로 묶어서 처리해야 하는 경우도 있는데,
        이때는 OpenSSL 등을 이용하자!!!  (자바의 keytool은 기본적으로 제공하지 않으므로, 별도 프로그램을 이용하자)
       

II. JAVA를 통한 SSL 통신
    -. 자바에서는 기본적으로 keystore를 사용하니깐, keystore를 하나 준비하고,
    -. 대상 SSL 사이트의 인증서를 keystore에 import 한다.
        ex) keytool -import -alias 별명 -keystore 키스토어파일 -file 불러들일 서버 인증서
    -. 그리고 자바 코드에서 해당 keystore에 로드한 인증서를 신뢰하겠다는 의미로 TrustKeySotre를 지정한다.
         ex) System.setProperty("javax.net.ssl.trustkeyStore", XXXX); ....
    -. 다음은 HttpsURLConnection을 이용하여 Connection을 얻어오고, In/OutputStream 처리하면 끝.
    -. 간혹 서버 인증서의 등록된 도메인과 서비스 도메인이 틀릴 경우가 왕왕 있는데...
       이럴때는 javax.net.ssl.HostnameVerifier.verify를 true로 리턴토록 처리해줘라...

저작자 표시
Posted by 승현아범
technology/web | script2011/01/07 14:21

HTML5 한글 번역 사이트가 있어서 참조한다.
이런 일들은 하는 사람들 ... 훌륭하다.

저작자 표시
Posted by 승현아범
TAG HTML, 번역

Java HotSpot Garbage Collection
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html


Diagnosing a Garbage Collection problem
http://www.oracle.com/technetwork/java/example-141412.html


Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html


Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning
http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

저작자 표시
Posted by 승현아범
TAG GC, JVM, tuning

  • Card-Marking Optimization Issue
  • A flaw in the implementation of a card-marking performance optimization in the JVM can cause heap corruption under some circumstances. This issue affects the CMS garbage collector prior to 6u18, and the CMS, G1 and Parallel Garbage Collectors in 6u18. The serial garbage collector is not affected. Applications most likely to be affected by this issue are those that allocate very large objects which would not normally fit in Eden, or those that make extensive use of JNI Critical Sections (JNI Get/Release*Critical).

    This issue will be fixed in the next Java SE 6 update.

    Meanwhile, as a workaround to the issue, users should disable this performance optimization by -XX:-ReduceInitialCardMarks.

    Refer to 6896647 and 6888898.

  • 저작자 표시
    Posted by 승현아범
    요즘 부하테스트가 한창이다.
    부하테스트로 로드런너를 사용중인데, 이넘이 애를 먹여서 하루종일 헛탕만 쳤다.
    예전에는 그냥 그렇게 보이던 테스트가 내 사이트를 직접 테스트하려니 그냥 지나쳐지지가 않는다.
    TPS며, 처리시간, CPU, 메모리 등등 ... 리소스 하나하나가 내 피와 살 같다.

    테스트를 진행하며 몇가지 환경적인 제약으로 인해서 제대로 테스트가 안 되는 부분이 있는데,
    바로 네트웍이다.
    정상적인 테스트라면 DMZ 구간의 1G망에서 테스트를 하면 좋겠지만,
    여기 환경상 그렇지가 못하다.
    그래서 어쩔 수 없이 ISP업체의 100M bps 전용선을 가져다 쓰기로 했다.
    인터넷을 통한 부하테스트라...  영 찝찝하지만 ...  여기서 배운 것중에 하나가 주어진 환경에서 최선을 다한다... 아니겠는가...

    참... APM으로 제니퍼를 도입했는데, 생각보다 훌륭하다.
    JVM 환경하에서만 사용해야 한다는 단점이 있지만 JAVA 환경을 구성하고 있다면 꽤 쓸만하다.
    UI측면에서는 조금 더 가꿔가야 하겠지만 추천할만 하겠다.

    얼릉 얼릉 끝내고 ... 빨리 오픈했으면 바램 뿐이다.

    저작자 표시
    Posted by 승현아범
    technology/web | script2010/04/19 16:41
    어제 경훈이 결혼으로 역전의 용사들을 다시 만날 수 있었다.
    이제는 이런 경조사가 아니면 얼굴 보기도 힘들다.
    다들 뿔뿔히 흩어져 각자의 삶을 살고 있지만 그래도 IT라는 그늘은 한결같다.
    개발자로, 관리자로, 어떤 친구는 CEO로 ...
    그나마 다들 잘 지내고 있어서 고맙고 다행이다라는 생각이 든다.


    각자가 알고 있는 소식들을 나누고 얘기를 한참이나 했다.
    역쉬 화제는 스마트폰이다.
    인터넷이 붐을 일으킬때의 상황과 비슷한 느낌이다.
    1996년 군대를 제대하고, 웹을 한창 공부할 때도 같은 느낌이었는데 ...  (netscape vs. iexploer)
    지금은 iphone 과 android에 맞춰서 개발을 하느라 분주하다.
    그때도 지금과 다름없이 누가 시장을 점유할까가 모두의 관심사였다.
    예전 상황에 비추어보면, ms가 apple을, netscape가 android를 닮았다.
    (사실 그때는 netscape가 조금 더 시장 점유율이 높았던 기억이 난다.)
    그때와 조금 다른 상황이라면 좌우가 좀 바꼈고, android가 이미 open시장에 나왔다는 정도일까...
    지금의 후배들은 이 netscape와 ms의 전쟁을 기억 못하겠지만, 이 전쟁(그때는 전쟁이라고 표현들을 했음) 을 참고해서 현재의 스마트폰을 바라본다면,,,  좀 더 잼있는 관전 포인트가 되지 않을까 싶다.

    저작자 표시
    Posted by 승현아범
    technology2010/04/16 19:39
    간만에 가슴 설레는 기술이 나오는거 같다.
    사실 구글맵이 나왔을때는 기술의 깊이는 모르고, 뭔가 다르다는 느낌이었는데...
    Photosynth 서비스는 대단하다. 어떻게 이런걸 만들까... 하는 생각부터 들었다.
    세상의 모든 이미지를 연결한다는 기발한 아이디어와 이미지를 오버랩할 수 있는 기술, 공간과 시간을 여행할 수 있다는 상상만으로도 분명 가슴이 설레는 기술임에 틀림없다.
    윈도우 7 모바일에서 빙과 통합 예정이라는데 데모의 반만이라도 돌아간다면야 ...
    "상상하라 그 이상을 만나게 될 것이다" 라는 광고카피가 생각난다.

    저작자 표시
    Posted by 승현아범
    technology/web | script2010/03/14 00:39

    1. Creating Stored Procedures

    PROCEDURE / FUNCTION
    : 차이점은 리턴값 여부??

        -. sqlplus 시작시마다 매번 "sql>define _editor=vi" 귀찮으니깐...
           login.sql 파일을 생성하여, 해당 구문을 넣으면 항상 실행된다.
           (set serveroutput on size unlimited 도 포함하면 좋지....)

        -. procedure 작성하고,

        -. 에러나면 "show error" 로 확인하고,

        -. execute "프로시져 이름" 실행

        -. 외부/프로그램에서 실행시에는 BEGIN my_proc; END; 식으로 호출하면 됨.

        * Procedure Parameter Mode
            -. IN : 외부에서 전달된 파라미터를 정의할 때
            -. OUT : 생성된 데이터를 외부로 전달 할때
            -. INOUT : IN OUT 변수를 하나로 ...

        -. 외부/프로그램에서 정의한 BIND변수를 실행할 때는 ":"을 사용한다.
            sqlplus 또는 Pro*C 에서 직접 지정한 변수는 BIND변수다.

        -- my_proc 프로시져 생성
        CREATE OR REPLACE PROCEDURE my_proc (p_id IN NUMBER, p_name OUT VARCHAR2)
        IS
            v_last_name employees.last_name%TYPE;
        BEGIN
            SELECT last_name INTO v_last_name
            FROM employees
            WHERE employee_id = p_id;
            p_name := v_last_name;
        END;
        /
    
        -- my_proc 프로시저의 OUT리턴값을 확인하기 위해서 다음을 실행
        DECLARE
            v_name VARCHAR2(30) := 'HELLO';
        BEGIN
            DBMS_OUTPUT.PUT_LINE(v_name);
            my_proc(102, v_name);
            DBMS_OUTPUT.PUT_LINE(v_name);
        END;
        /
    

        -- IN OUT 변수를 하나의 파라미터로 사용하기
        -- JOBS 테이블에서 job_id로 조회하고, job_title를 리턴받는다.
        CREATE OR REPLACE PROCEDURE pr_get_job (p_job IN OUT VARCHAR2)
        IS
        BEGIN
            SELECT job_title INTO p_job
            FROM jobs
            WHERE job_id = p_job;
        END;
        /
    
        -- pr_get_job 프로시저의 OUT리턴값을 확인하기 위해서 다음을 실행
        DECLARE
            v_job VARCHAR2(30) := 'SA_MAN';
        BEGIN
            DBMS_OUTPUT.PUT_LINE(v_job);
            my_proc(v_job);
            DBMS_OUTPUT.PUT_LINE(v_job);
        END;
        /
    

        * 삭제시에는
            DROP PROCEDURE procedure_name;


    2. Creating Stored Functions

        * FUNCTION
            -. 리턴값이 할당되지 않는 곳에서는 사용 불가.
            -. SQL 안에서 함께 사용 가능하다.
            -. 프로시져와 비교해서 RETURN 절만이 추가된다.
        -- FUNCTION 사용하기
        -- join 으로 할 거 테스트하기 (이렇게 사용하지 말자) : 실제 Nested Loop Join을 발생시킨다..
        CREATE OR REPLACE FUNCTION fn_get_dept(p_dept IN NUMBER) RETURN VARCHAR2
        IS
            v_name VARCHAR2(50);>
        BEGIN
            SELECT department_name INTO v_name
            FROM departments
            WHERE department_id = p_dept;
            RETURN(v_name);
        END;
        /
    
        -- fn_get_dept FUNCTION 사용하기
        --column last_name format A20
        --column dname format A25
        SELECT employee_id, last_name, department_id,
                    fn_get_dept(department_id) dname
        FROM employees;
        TIP) 위 처럼 하면, 모든 쿼리가 2번씩 실행되어, 성능에 지대한 영향을 끼친다.
              차라리 Sub Query 를 사용하자!
        (sub query는 같은 department_id 에 대해서는 쿼리가 한번만 실행된다!!)
        SELECT employee_id, last_name, department_id,
            ( SELECT department_name INTO v_name
            FROM departments
            WHERE department_id = A.department_id ) dname
        FROM employees A;
    
        * 삭제시에는
            DROP FUNCTION procedure_name;


        * Stored Function 제약사항!
        1) Parameter Mode : IN
        2) Parameter Data Type : Database Data Type
                                               -. Varchar2, Number : 정상
                                               -. Boolean, PLS-Integer : 사용불가
        3) Return Value Data Type  "2)" 동일
        4) DML 불가
        5) Commit , Rollback 불가
        6) 같은 테이블을 Fuction으로 만들고, 해당 Function을 같은 테이블로 처리시에는 에러!
             예) select ..., f(x) from emp  그리고  f(x) = select ... from emp 인 경우

        --> 실제 컴파일은 정상으로 처리되나, SQL과 함께 사용시에는 에러 발생됨!!!  (Runtime Error)


        * PROCEDURE 와 FUNCTION 차이
            -. standalone 형태로 사용할거면, procedure!!  (예 - 배치성 업무)
            -.


    3. Creating Packages
        -. Oracle 패키지에서는 자주 사용 됨? (Forms, 기타 ... )
        -. OOP개념이 포함됨 (캡슐화)
        -. Specification + (Body) 로 구성됨.
            : spec에 정의한 내용들은 모두 public!  ex) public 변수, public procedure/function
              body에 정의한 내용들은 모두 private!  ex) private 변수, private proceduer/function
              body 내에서도 package 변수는 접근가능하나, local 변수라면 접근 불가.
              body없이 패키지만 사용하여, 상수 클래스와 같은 효과를 낼 수 있음.
        -. Anomymous, Procedure, Function 에서 사용 가능
            : Spec 접근 가능, Body 접근 불가
        -. 장단점.
            : 하나의 패키지로 묶으면, 한번의 IO만 발생하여, 성능이 좋다?
              대신 메모리 점유율 높아짐.
              여러개의 패키지로 안 묶고 단인 프로시져로 하면, 메모리는 낮지만 IO가 높아짐.
              그래서 관련있는 넘들만 패키지로 잘~ 묶을 것!

        * Spec
            -. public 성격, 외부 접근 가능
            -. Declaration : 선언

        * Body
            -. private 성격 : 외부 접근 불가
            -. Definition

        * 삭제
            DROP PACKAGE package_name;


        * BULK COLLECT
        * RETURNING ...
        * ...


    10. Trigger
        -. DML/DDL Trigger 등이 있다.

        1) Statement Trigger
            : "For each Row" 사용하지 않음.
              DML 작업에 영향 받은 Row 수에 관계없이 1개 실행마다 1회만 fire

        2) Row Trigger
            : For each Row 키워드 사용
             영향받은 Row의 건수만큼 fire


        * Creating a DML Statement Trigger
        1) Trigger Timing : After, Before, (Instead of)
        2) Trigger Event : Insert, Update, Delete
        3) Trigger Table : ON <table명>
        4) Trigger Type : for each Row

        TIP) Trigger 를 이용해서 DML을 막을 수도 있다.
               -.  가령 업무 시간 이외에는 Insert 작업을 못 하도록 ...  (Page 10-11)
               -. 감사용도로써, DML을 일으키는 작업자와 시간, 예전 데이터 등을 기록 할 수도 있다. (Page 10-15)

    저작자 표시
    Posted by 승현아범