SEC 131) ORM(Object-Relational Mapping)
* ORM(Object-Relational Mapping)
- ORM은 객체지향 프로그래밍의 객체(Object)와 관계형 데이터베이스(Relational DataBase)의 데이터를 연결(Mapping)하는 기술을 의미
- ORM은 객체지향 프로그래밍에서 사용할 수 있는 가상의 객체지향 데이터베이스를 만들어 프로그래밍 코드와 데이터를 연결함
- ORM으로 생성된 가상의 객체지향 데이터베이스는 프로그래밍 코드 또는 데이터베이스와 독립적이므로 재사용 및 유지보수가 용이
* ORM 프레임워크
- ORM 프레임워크는 ORM을 구현하기 위한 구조와 구현을 위해 필요한 여러기능들을 제공하는 소프트웨어를 의미
- ORM 프레임워크 종류
기반언어 | ORM 프레임 워크 |
Java | JPA, Hibernate, EclipseLink, DataNucleus, Ebean 등 |
C++ | ODB, QxOrm 등 |
Python | Django, SQLAlchemy, Storm 등 |
.NET | NHibernate, DatabaseObjects, Dapper 등 |
PHP | Doctrine, Propel, RedBean 등 |
* ORM의 한계
- 프레임워크가 자동으로 SQL을 작성하기 때문에 의도대로 SQL이 작성되었는지 확인해야함.
- 객체지향적인 사용을 고려하고 설계된 데이터베이스가 아닌 경우 프로젝트가 크고 복잡해질수록 ORM 기술을 적용하기 어려움
- 기존의 기업들은 ORM을 고려하지 않은 데이터베이스를 사용하고 있기 때문에 ORM에 적합하게 변환하려면 많은 시간과 노력이 필요
SEC 132) 쿼리 성능 최적화(C)
* 쿼리 성능 최적화
- 쿼리 성능 최적화는 데이터 입,출력 애플리케이션의 성능 향상을 위해 SQL코드를 최적화 하는 것
- 쿼리 성능을 최적화하기 전에 성능 측정 도구인 APM을 사용해 최적화할 쿼리를 선정함
- 최적화 할 쿼리에 대해 옵티마이저가 수립한 실행 계획을 검토하고 SQL 코드와 인텍스를 재구성함
* 옵티마이져(Optimizer)
- 옵티마이저는 작성된 SQL이 가장 효율적으로 수행되도록 최적의 경로를 찾아주는 모듈
- RBO(Rule Based Optimizer)와 CBO(Cost Based Optimizer) 두 종류가 있다
- RBO는 데이터베이스 관리자(DBA)가 사전에 정의해둔 규칙에 의거해 경로를 찾는 규칙 기반 옵티마이저
- CBO는 입,출력 속도, CPU 사용량, 블록개수, 개체의 속성, 튜플 개수 등을 종합하여 각 DBMS마다 고유의 알고리즘에 따라 산출되는 ‘비용’으로 최적의 경로를 찾는 비용 기반 옵티마이저
- RBO와 CBO의 차이점
RBO | CBO | |
최적화 기준 | 규칙에 정의된 우선순위 | 액세스 비용 |
성능 기준 | 개발자의 SQL 숙련도 | 옵티마이저의 예측 성능 |
특징 | 실행 계획 예측이 쉬움 | 성능 통계치 정보 활용, 예측이 복잡함 |
고려사항 | 개발자의 규칙 이해도, 규칙의 효율성 | 비용 산출 공식의 정확성 |
* 실행 계획(Execution Plan)
- 실행 계획은 DBMS의 옵티마이저가 수립한 SQL코드의 실행 절차와 방법을 의미
- 실행 계획은 EXPLAIN 명령어를 통해 확인할 수 있으며, 그래픽이나 텍스트로 표현
- 실행 계획에는 요구사항들을 처리하기 위한 연산 순서가 적혀있으며, 연산에는 조인, 테이블 검색, 필터, 정렬 등이 있음
* 쿼리 성능 최적화 방법
- 쿼리 성능 최적화는 실행 계획에 표시된 연산 순서, 조인 방식, 테이블 조회방법 등을 참고해 SQL문이 더 빠르고 효율적으로 작동하도록 SQL 코드와 인덱스를 재구성하는 것을 의미
SQL 코드 재구성 | WHERE 절 추가 WHERE 절에 연산자 사용 제한 IN을 EXISTS로 대체 힌트로 액세스 경로 및 조인 순서 변경 |
인덱스 재구성 | 조회되는 속성과 조건을 고려해 인덱스 구성 인덱스 추가 및 기존 인덱스의 열 순서 변경 테이블을 참조하는 다른 SQL 문으로의 영향 고려 IOT(Index-Organized Table) 구성 고려 불필요한 인덱스 제거 |
SEC 133) Secure SDLC(A)
필기 20.8
* Secure SDLC
- 보안상 안전한 소프트웨어를 개발하기 위해 SDLC에 보안강화를 위한 프로세스를 포함한 것을 의미
- 요구사항 분석, 설계, 구현, 테스트, 유지보수 등 SDLC 전체 단계에 걸쳐 수행되어야 할 보안 활동을 제시
>> 대표적인 방법론
방법론 | 내용 |
CLASP | SDLC의 초기 단계에서 보안을 강화하기 위해 개발된 방법론 |
SDL | 마이크로소프트 사에서 안전한 소프트웨어 개발을 위해 기존의 SDLC를 개선한 방법론 |
필기 20.8 Seven Touchpoint |
소프트웨어 보안의 모범사례를 SDLC에 통합한 방법론 |
* SDLC 단계별 보안 활동
요구사항 분석 단계 - 보안 항목에 해당하는 요구사항을 식별하는 작업을 수행함
설계단계 - 식별된 보안 요구사항들을 소프트웨어 설계서에 반영하고, 보안 설계서를 작성함
구현단계 - 표준 코딩 정의서 및 소프트웨어 개발 보안 가이드를 준수하며, 설계서에 따라 보안 요구사항들을 구현함
테스트단계 - 설계 단계에서 작성한 보안 설계서를 바탕으로 보안 사항들이 정확히 반영되고 동작되는지 점검함
유지보수단계 - 이전과정을 모두 수행하였음에도 발생할 수 있는 보안사고들을 식별/ 사고발생시 이를해결하고 보안패치 실시
필기 20.8
* 소프트웨어 개발 보안 요소
보안요소 | 설명 |
필기 20.8 기밀성(Confidentiality) |
시스템 내의 정보와 자원은 인가된 사용자에게만 접근이 허용 정보가 전송중에 노출되더라도 데이터를 읽을 수 없음 |
필기 20.8 무결성(Integrity) |
시스템 내의 정보는 오직 인가된 사용자만 수정할 수 있음 |
20.11, 필기 20.8 가용성(Availability) |
인가받은 사용자는 시스템 내의 정보와 자원을 언제라도 사용할 수 있음 |
인증(Authentication) | 시스템 내의 정보와 자원을 사용하려는 사용자가 합법적인 사용자인지를 확인하는 모든 행위 대표적인 방법: 패스워드, 인증용 카드, 지문 검사 등 |
부인방지(NonRepudiation) | 데이터를 송.수신한 자가 송.수신 사실을 부인할 수 없도록 송.수신 증거를 제공 |
* 시큐어 코딩(Secure Coding)
- 시큐어 코딩(Secure Coding)은 구현 단계에서 발생할 수 있는 보안 취약점들을 최소화하기 위해 보안 요소들을 고려하며 코딩하는 것을 의미
- 보안 취약점을 사전 대응하여 안정성과 신뢰성을 확보
- 보안 정책을 바탕으로 시큐어 코딩 가이드를 작성하고, 개발 참여자에게는 시큐어 코딩 교육을 실시함.
SEC 134) 세션 통제(C)
* 세션 통제
- 세션 통제는 세션의 연결과 연결로 인해 발생하는 정보를 관리하는 것을 의미
- 소프트웨어 개발 과정 중 요구사항 분석 및 설계 단계에서 진단해야하는 보안 점검 내용
>> 세션 통제의 보안 약점
- 불충분한 세션관리 - 일정한 규칙이 존재하는 세션 ID가 발급되거나 타임아웃이 너무 길게 설정되어 있는 경우 발생하는 보안 약점
- 잘못된 세션에 의한 정보 노출 - 다중 스레드(Multi-Thread) 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점
* 세션 설계 시 고려사항
- 시스템의 모든 페이지에서 로그아웃이 가능하도록 UI(User Interface)를 구성
- 로그아웃 요청 시 할당된 세션이 완전히 제거되도록 함
- 세션 타임아웃은 중요도가 높으면 2~5분, 낮으면 15~30분으로 설정
- 이전 세션이 종료되지 않으면 새 세션이 생성되지 못하도록 설계
- 중복 로그인을 허용하지 않은 경우 클라이언트의 중복 접근에 대한 세션 관리 정책을 수립
* 세션ID의 관리방법
- 세션ID는 안전한 서버에서 최소 128비트의 길이로 생성
- 세션ID의 예측이 불가능하도록 안전한 난수 알고리즘을 적용
- 세션ID가 노출되지 않도록 URL Rewrite 기능을 사용하지 않는 방향으로 설계
- 로그인 시 로그인 전의 세션ID를 삭제하고 재할당함
- 장기간 접속하고 있는 세션ID는 주기적으로 재할당되도록 설계
SEC 135) 입력데이터 검증 및 표현(B)
20.7 필기 20.9, 20.8
* 입력 데이터 검증 및 표현
- 입력 데이터 검증 및 표현은 입력 데이터로 인해 발생하는 문제들을 예방하기 위해 구현 단계에서 검증해야 하는 보안 점검 항목들
>> 입력 데이터 검증 및 표현의 보안 약점
보안 약점 | 설명 |
20.7 SQL 삽입 (Injection) |
- 웹 응용 프로그램에 SQL을 삽입하여 내부 데이터베이스(DB) 서버의 데이터를 유출 및 변조하고, 관리자 인증을 우회하는 보안 약점 - 동적쿼리에 사용되는 입력데이터에 예약어 및 특수문자가 입력되지 않게 필터링 되도록 설정하여 방지할 수 있음 |
경로 조작 및 자원 삽입 | - 데이터 입출력 경로를 조작해 서버 자원을 수정.삭제할 수 있는 보안 약점 - 사용자 입력값을 식별자로 사용하는 경우, 경로 순회 공격을 막는 필터로 사용해 방지할 수 있음 |
필기 20.9 크로스사이트 스크립팅(XSS) |
웹페이지에 악의적인 스크립트를 삽입하여 방문자들의 정보를 탈취하거나, 비정상적인 기능 수행을 유발하는 보안 약점 HTML 태그의 사용을 제한하거나 스크립트에 삽입되지 않도록‘<’,‘>’,‘&’ 등의 문자를 다른 문자로 치환함으로써 방지할 수 있음 |
운영체제 명령어 삽입 | 외부 입력값을 통해 시스템 명령어의 실행을 유도함으로써 권한을 탈취하거나 시스템 장애를 유발하는 보안 약점 웹 인터페이스를 통해 시스템 명령어가 전달되지 않도록 하고, 외부 입력 값을 검증 없이 내부 명령어로 사용하지 않음으로써 방지할 수 있음 |
위험한 형식 파일 업로드 | 악의적인 명령어가 포함된 스크립트 파일을 업로드함으로써 시스템에 손상을 주거나, 시스템을 제어할 수 있는 보안 약점 업로드 되는 파일의 확장자 제한, 파일명의 암호화, 웹사이트와 파일 서버의 경로 분리, 실행 속성을 제거하는 등의 방법으로 방지할 수 있음 |
신뢰되지 않는 URL 주소로 자동접속 연결 | 입력 값으로 사이트 주소를 받는 경우 이를 조작해 방문자를 피싱 사이트로 유도하는 보안 약점 연결되는 외부 사이트의 주소를 화이트 리스트로 관리함으로써 방지할 수 있음 |
필기 20.8 메모리 버퍼 오버플로 |
연속도니 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에서 자료를 읽거나 쓰려고 할 때 발생하는 보안 약점 메모리 버퍼를 사용할 경우 적절한 버퍼의 크기를 설정하고, 설정된 범위의 메모리 내에서 올바르게 읽거나 쓸 수 있도록 함으로써 방지할 수 있음 |
SEC 136) 보안기능(B)
필기 20.8
* 보안 기능
- 보안기능은 소프트웨어 개발의 구현 단계에서 코딩하는 기능인 인증, 접근제어, 기밀성, 암호화 등을 올바르게 구현하기 위한 보안 점검 항목들
>> 보안 기능의 보안 약점
보안 약점 | 설명 |
적절한 인증 없이 중요기능 허용 | 보안 검사를 우회하여 인증과정 없이 중욯나 정보 또는 기능에 접근 및 변경이 가능 중요정보나 기능을 수행하는 페이지에서는 재인증 기능을 수행하도록 하여 방지할 수 있음 |
부적적한 인가 | 접근제어 기능이 없는 실행경로를 통해 정보 또는 권한을 탈취할 수 있음 모든 실행경로에 대해 접근제어 검사를 수행하고, 사용자에게는 반드시 필요한 접근 권한만을 부여하여 방지할 수 있음 |
중요한 자원에 대한 잘못된 권한 설정 | 권한 설정이 잘못된 자원에 접근하여 해당 자원을 임의로 사용할 수 있음 소프트웨어 관리자만 자원들을 읽고 쓸 수 있도록 설정하고, 인가되지 않은 사용자의 중요 자원에 대한 접근 여부를 검사함으로써 방지할 수 있음 |
취약한 암호화 알고리즘 사용 | 암호화된 환경설정 파일을 해독하여 비밀번호 등의 중요정보를 탈취 할 수 있음 안전한 암호화 알고리즘을 이용하고, 업무관련 내용이나 개인정보 등에 대해서는 IT 보안인증사무국이 안정성을 확인한 암호모듈을 이용함으로써 방지할 수 있음 |
중요정보 평문 저장 및 전송 | 암호화되지 않은 평문 데이터를 탈취하여 중요한 정보를 획득할 수 있음 중요한 정보를 저장하거나 전송할 때는 반드시 암호화 과정을 거치도록 하고, HTTPS 또는 SSL 과 같은 보안 채널을 이용함으로써 방지할 수 있음 |
필기 20.8 하드코드 된 암호화 키 |
암호화된 키도 하드코드된 경우 유출시 역계산 또는 무차별 대입 공격에 의해 탈취될 수 있음 상수 형태의 암호키를 사용하지 않고, 암호화 키 생성 모듈 또는 보안이 보장된 외부 공간을 이용함으로써 방지할 수 있음 |
SEC 137) 시간 및 상태(C)
* 시간 및 상태
- 시간 및 상태는 동시 수행을 지원하는 병렬 처리 시스템이나 다수의 프로세스가 동작하는 환경에서 시간과 실행 상태를 관리하여 시스템이 원활하게 동작되도록 하기 위한 보안 점검 항목들
>> 시간 및 상태의 보안 약점
보안 약점 | 설명 |
TOCTOU 경쟁 조건 | 검사 시점(Time Of Check)과 사용 시점(Time of Use)을 고려하지 않고 코딩하는 경우 발생하는 보안 약점 코드 내에 동기화 구문을 사용해 해당 자원에는 한 번에 하나의 프로세스만 접근 가능하도록 구성함으로써 방지할 수 있음 |
종료되지 않는 반복문 또는 재귀함수 | 반복문이나 재귀함수에서 종료 조건을 정의하지 않았거나 논리 구조상 종료될 수 없는 경우 발생하는 보안 약점 모든 반복문이나 재귀 함수의 수행 횟수를 제한하는 설정을 추가하거나, 종료 조건을 점검하여 반복 또는 호출의 종료 여부를 확인함으로써 방지할 수 있음 |
SEC 138) 에러 처리(D)
* 에러처리 - 소프트웨어 실행 중 발생 할 수 있는 오류들을 사전에 정의해 오류로 인해 발생할 수 있는 문제들을 예방하기 위한 보안 점검 항목들
>> 에러처리의 보안 약점
보안 약점 | 설명 |
오류 메시지를 통한 정보노출 | 오류 발생으로 실행환경, 사용자 정보, 디버깅 정보등의 중요한 정보가 메시지를 통해 외부에 노출되는 보안 약점 가능한 한 내부에서만 처리되도록 하거나 메시지를 출력할 경우 최소한의 정보 또는 사전에 준비된 메시지만 출력되도록 하여 방지할 수 있음 |
오류 상황 대응 부재 | 소프트웨어 개발 중 에러처리를 하지 않았거나 미비로 인해 발생하는 보안 약점 오류가 발생할 수 있는 부분에 에러처리 구문을 작성하고 제어문을 활용하여 오류가 악용되지 않도록 코딩함으로써 방지할 수 있음 |
부적절한 예외처리 | 함수의 반환값 또는 오류들을 세분화하여 처리하지 않고 광범위하게 묶어 한 번에 처리하거나, 누락된 예외가 존재할 때 발생하는 보안 약점 모든 함수의 반환값이 의도대로 출력되는지 확인하고, 세분화된 예외처리를 수행함으로써 방지할 수 있음 |
SEC 139) 코드 오류(C)
* 코드 오류 - 소프트웨어 구현 단계에서 개발자들이 코딩 중 실수하기 쉬운형(Type) 변환, 자원 반환 등의 오류를 예방하기 위한 보안 점검 항목들이다.
>> 코드 오류의 보안 약점
보안 약점 | 설명 |
널 포인터(Null Pointer) 역참조 | 널 포인터가 가리키는 메모리의 위치에 값을 저장할 EO 발생하는 보안 약점 포인터를 이용하기 전에 널 값을 갖고있는지 검사함으로써 방지할 수 있음 |
부적절한 자원 해제 | 자원을 반환하는 코드를 누락하거나 프로그램 오류로 할당된 자원을 반환하지 못했을 때 발생하는 보안 약점 프로그램 내에 자원반환 코드가 누락되었는지 확인하고, 오류로 인해 함수가 중간에 종료되었을 때 예외 처리에 관꼐없이 자원이 반환되도록 코딩함으로써 방지할 수 있음 |
해제된 자원 사용 | 이미 사용이 종료되어 반환된 메모리를 참조하는 경우 발생하는 보안 약점 반환된 메모리에 접근할 수 없도록 주소를 저장하고 있는 포인터를 초기화함으로써 방지할 수 있음 |
초기화되지 않은 변수 사용 | 변수 선언 후 값이 부여되지 않은 변수를 사용할 때 발생하는 보안약점 변수 선언 시 할당된 메모리를 초기화함으로써 방지할 수 있음 |
필기 20.6
* 스택가드(Stack Guard)
- 널 포인터 역참조와 같이 주소가 저장되는 스택에서 발생하는 보안 약점을 막는 기술 중 하나
- 메모리상에서 프로그램의 복귀 주소와 변수 사이에 특정 값을 저장한 후 그 값이 변경되었을 경우 오버플로우 상태로 판단하여 프로그램 실행을 중단함으로써 잘못된 복귀 주소의 호출을 막는다.
SEC 140) 캡슐화(C)
- 캡슐화는 정보 은닉이 필요한 중요한 데이터와 기능을 불완전하게 캡슐화하거나 잘못 사용함으로써 발생할 수 있는 문제를 예방하기 위한 보안 점검 항목들
>> 캡슐화의 보안 약점
보안 약점 | 설명 |
잘못된 세션에 의한 정보 노출 | 다중 스레드(Multi-Thread) 환경에서 멤버 변수에 정보를 저장할 때 발생하는 보안 약점 멤버 변수보다 지역변수를 활용해 변수의 범위를 제한함으로써 방지할 수 있음 |
제거되지 않고 남은 디버그 코드 | 개발 중에 버그 수정이나 결과값 확인을 위해 남겨둔 코드들로 인해 발생하는 보안 약점 소프트웨어 배포 전에 코드 검사를 수행하여 남아있는 디버그 코드를 삭제함으로써 방지할 수 있음 |
시스템 데이터 정보 노출 | 시스템의 내부 정보를 시스템 메시지 등을 통해 외부로 출력하도록 코딩했을 때 발생하는 보안약점 노출되는 메시지에는 최소한의 정보만을 제공함으로써 방지 할 수 있음 |
Public 메소드로부터 반환된 Private 배열 | 선언된 클래스 내에서만 접근이 가능한 Private 배열을 모든 클래스에서 접근이 가능한 Public 메소드에서 반환할 EO 발생하는 보안약점 Private 배열을 별도의 메소드를 통해 조작하거나, 동일한 형태의 복제본으로 반환받은 후 값을 전달하는 방식으로 방지 할 수 있음 |
Private 배열에 Public 데이터 할당 | Private 배열에 Public으로 선언된 데이터 또는 메소드의 파라미터를 저장할 때 발생하는 보안 약점 Public으로 선언된 데이터를 Private 배열에 저장할 때, 레퍼런스가 아닌 값을 직접 저장함으로써 방지할 수 있음 |
필기 20.9, 20.6
* 접근 제어자
- 접근 제어자는 프로그래밍 언어에서 특정 개체를 선언할 때 외부로부터 접근을 제한하기 위해 사용되는 예약어
- 접근 제어자 종류
접근제어자 | 클래스 내부 | 패키지 내부 | 하위클래스 | 패키지 내부 |
필기 20.9, 20.6 Public |
O | O | O | O |
필기 20.6 Protected |
O | O | O | X |
필기 20.9 Default |
O | O | X | X |
필기 20.9, 20.6 Private |
O | X | X | X |