QnA로 알아보는 log4j 보안취약점 대응 가이드.pdf
0.41MB

□ 개요
 o Apache 소프트웨어 재단은 자사의 Log4j 2에서 발생하는 취약점을 해결한 보안 업데이트 권고[1]
 o 공격자는 해당 취약점을 이용하여 악성코드 감염 등의 피해를 발생시킬수 있으므로, 최신 버전으로 업데이트 권고
    ※ 관련 사항은 참고사이트 [6] 취약점 대응가이드를 참고 바랍니다.
    ※ 참고 사이트 [4]를 확인하여 해당 제품을 이용 중일 경우, 해당 제조사의 권고에 따라 패치 또는 대응 방안 적용
    ※ Log4j 취약점을 이용한 침해사고 발생시 한국인터넷진흥원에 신고해 주시기 바랍니다.
 
□ 주요 내용
 o Apache Log4j 2에서 발생하는 원격코드 실행 취약점(CVE-2021-44228)[2]
 o Apache Log4j 2에서 발생하는 원격코드 실행 취약점(CVE-2021-45046)[7]
 o Apache Log4j 1.x에서 발생하는 원격코드 실행 취약점(CVE-2021-4104)[8]
    ※ Log4j : 프로그램 작성 중 로그를 남기기 위해 사용되는 자바 기반의 오픈소스 유틸리티

□ 영향을 받는 버전
 o CVE-2021-44228
  - 2.0-beta9 ~ 2.14.1 이하
 ※ 취약점이 해결된 버전 제외(Log4j 2.3.1, 2.12.2, 2.12.3 및 이후 업데이트 버전 제외)

 o CVE-2021-45046
  - 2.0-beta9 ~ 2.15.0 버전
 ※ 취약점이 해결된 버전 제외(Log4j 2.3.1, 2.12.2, 2.12.3 및 이후 업데이트 버전 제외)

 o CVE-2021-4104
   - 1.x 버전
      ※ JMSAppender를 사용하지 않는 경우 취약점 영향 없음

□ 대응방안
 o 제조사 홈페이지를 통해 최신버전으로 업데이트 적용 [3]
   ※ 제조사 홈페이지에 신규버전이 계속 업데이트되고 있어 확인 후 업데이트 적용 필요
    - CVE-2021-44228, CVE-2021-45046
      · Java 8 이상 : Log4j 2.17.0 이상 버전으로 업데이트
      · Java 7 : Log4j 2.12.3 이상 버전으로 업데이트
      · Java 6 : Log4j 2.3.1 이상 버전으로 업데이트
           ※ log4j-core-*.jar 파일 없이 log4j-api-*.jar 파일만 사용하는 경우 위 취약점의 영향을 받지 않음
   - CVE-2021-4104
      · Java 8 : Log4j 2.17.0 이상 버전으로 업데이트
      · Java 7 : Log4j 2.12.3 이상 버전으로 업데이트
      · Java 6 : Log4j 2.3.1 이상 버전으로 업데이트
 o 신규 업데이트가 불가능할 경우 아래와 같이 조치 적용
    - CVE-2021-44228, CVE-2021-45046
      · JndiLookup 클래스를 경로에서 제거

  zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

    - CVE-2021-4104
      · JMSAppender 사용 확인 후 코드 수정 또는 삭제
          ※ log4j 1.x버전 사용자의 경우 추가적인 업그레이드 지원 중지로 인해 다른 보안위협에 노출될 가능성이 높아 최신버전(2.x) 업데이트 적용 권고


□ 탐지정책
o 참고사이트 [6] 취약점 대응 가이드를 참고하여 탐지정책 적용
     ※ 본 탐지정책은 내부 시스템 환경에 따라 다르게 동작할 수 있으며, 시스템 운영에 영향을 줄 수 있으므로 충분한 검토 후 적용 바랍니다.
     ※ 공개된 탐지정책(참고사이트 [5])은 우회가능성이 있으므로 지속적인 업데이트가 필요합니다.

□ 침해사고 신고
 o 한국인터넷진흥원 인터넷침해대응센터 종합상황실(02-405-4911~5, certgen@krcert.or.kr)
 o 'KISA 인터넷보호나라&KrCERT' 홈페이지(www.boho.or.kr) → 상담및신고 → 해킹 사고

□ 기타 문의사항
 o 한국인터넷진흥원 사이버민원센터: 국번없이 118

[참고사이트]
[1] apache 보안업데이트 현황 : https://logging.apache.org/log4j/2.x/security.html
[2] 취약점 정보 : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228
[3] 신규버전 다운로드 : https://logging.apache.org/log4j/2.x/download.html
[4] 제조사별 현황 : https://github.com/NCSC-NL/log4shell/tree/main/software
[5] 탐지정책 : https://rules.emergingthreatspro.com/open/suricata-5.0/rules/emerging-exploit.rules
[6] 취약점 대응 가이드 : https://www.boho.or.kr/data/guideView.do?bulletin_writing_sequence=36390
[7] 취약점 정보 : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046
[8] 취약점 정보 : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-4104

/tomcat/bin/catalina.sh 수정

apache 서버의 rotatelogs를 활용한다.

if [ "$1" = "-security" ] ; then
if [ $have_tty -eq 1 ]; then
echo "Using Security Manager"
fi
shift
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
-classpath "\"$CLASSPATH\"" \
-Djava.security.manager \
-Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
2>&1 "&" | /usr/local/apache/bin/rotatelogs "$CATALINA_OUT"-%Y.%m.%d 86400 540 & <= 이부분 추가
#>> "$CATALINA_OUT" 2>&1 "&" <= 이부분 주석 처리

else
eval $_NOHUP "\"$_RUNJAVA\"" "\"$CATALINA_LOGGING_CONFIG\"" $LOGGING_MANAGER "$JAVA_OPTS" "$CATALINA_OPTS" \
-D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \
-classpath "\"$CLASSPATH\"" \
-Dcatalina.base="\"$CATALINA_BASE\"" \
-Dcatalina.home="\"$CATALINA_HOME\"" \
-Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
org.apache.catalina.startup.Bootstrap "$@" start \
2>&1 "&" | /usr/local/apache/bin/rotatelogs "$CATALINA_OUT"-%Y.%m.%d 86400 540 & <= 이부분 추가
#>> "$CATALINA_OUT" 2>&1 "&" <= 이부분 주석 처리
fi

'프로그래밍 > 리눅스' 카테고리의 다른 글

우분투에 파이썬 설치  (0) 2024.01.02
svn 재시작  (0) 2023.01.17
리눅스 파일 있으면 복사 없으면 생성하기  (0) 2022.08.18
리눅스 특정 폴더 용량 확인하기  (0) 2022.07.27
도커 개념 정리  (0) 2022.05.24

WORK_DIR 은 현재 스크립트 파일 디렉토리
FILE_DIR 은 파일 검색하는 디렉토리
BACK_DIR 은 FILE_DIR 디렉토리 내의 데이터 이동 디렉토리이다.
============================================================================================
WORK_DIR=/B_PBS/ShFiles
FILE_DIR=/B_PBS/SrcFiles/AITAS
BACK_DIR=test


#pbs_daily.prm 파일안에 있는 InputFileName 글자가 있는 라인을 읽는다. 즉, InputFileName=20120101 형식으로 되어 있는 프로퍼티 값을 읽기위한 것이다.
param=`grep InputFileName /B_PBS/BWParam/pbs_daily.prm`
#substrig을 구현하여 프로퍼티의 값을 읽는다.
param=`expr substr $param 16 8`

BACK_DIR=${param}
mkdir ${FILE_DIR}/${BACK_DIR}

#패턴 목록 파일을 라인단위로 읽어 목록을 만든다.
file=${WORK_DIR}/data.txt

while read line
do

        #파일이 있는지 몰라 패턴(*)을 이용하여 찾아본다. 있는지 찾아본다는 얘기다. 여기서 놀란 것은 있으면 바로 변수에 정확한 파일명이 들어간다는 것에 놀랬다. 이렇게 편하다. 없으면 파일 존재여부 옵션인 -f 옵션에 의거하여 else 구문을 타게 된다.
        filename=${FILE_DIR}/${line}*_${param}

        if [ -f ${filename} ]
        then
                cp ${filename} ${FILE_DIR}/${BACK_DIR}/${line}${param}.dat
        else
                touch ${FILE_DIR}/${BACK_DIR}/${line}${param}.dat
        fi
done < "$file"

'프로그래밍 > 리눅스' 카테고리의 다른 글

svn 재시작  (0) 2023.01.17
톰켓 로그 분할 하는 방법  (0) 2022.08.25
리눅스 특정 폴더 용량 확인하기  (0) 2022.07.27
도커 개념 정리  (0) 2022.05.24
리눅스 파일명으로 검색  (0) 2020.03.12

$(document).ready(function() {
$(“#list”).jqGrid({ 선언부분 });
});

/ jqGrid url 전송 선언 : url, datype, mtype
url : ‘<c:url value="/" />/sample.do’, // url 선언
datatype : ‘json’, // 데이터 타입 지정
mtype : 'POST', // 데이터 전송 방식 지정
postData : {}, // url 보낼 값 설정, 검색조건 등의 초기값을 보낼 때 사용

// jqGrid 양식 선언부 caption, colNames, colModel, width, height 선언
caption : 'example Grid'; // caption 네임 설정 기본 미설정
colNames : ['컬럼1','컬럼2'], // 컬럼 헤더 설정
colModel : [{name : 'col1', index : 'col1', width : '100', align : 'center'},
{name : 'col1', index : 'col1', width : '100', align : 'center'}
],
width : 'auto', // 그리드의 넓이를 지정한다.
height : '100', // 그리드의 높이를 지정한다.

// jqGrid 추가 옵션 영역
loadonce : false, // ture로 설정할 경우 현재 조건으로 조회된 전체데이터를 DB를 다시 가져오지 않고 사용한다.
loadui : 'disable', // jqGrid 기본 로딩ui의 사용여부를 설정한다.
shrinkToFit : false, // Grid 전체 넓이에 맞춰서 자동으로 컬럼크기를 설정함 default:true
gridview : true, // 처리속도를 빠르게 해 줌. 뿌려 준 Grid 디자인을 재사용하게 하여 로딩시간을 개선
rownumbers : true, // rownum 표시여부
rownumWidth : 30, // rownum 컬럼 넓이 지정
rowNum : 15, // 한 화면에 표시할 행 개수를 지정한다.
rowList : [15,30,50,100], // rowList : rowNum을 선택할 수 있는 옵션을 지정한다.
pager : '#pager', // pager : 도구 모임이 될 div 태그를 지정한다.
viewrecords : true, // 데이터 건수를 pager에 보여줄 것인지를 설정
sortable : true, // 정렬 사용 여부 설정
sortname : 'regdt', // default Sort 조건
sortorder : 'desc', // sort 방법 설정
multiselect : true, // 그리드 좌측에 콤보박스 추가
cellEdit : true, // 셀수정 여부 설정. false로 설정할 경우 그리드 콤보 박스를 제외하고 전체 lock 상태가 된다.
cellsubmit : 'clientArray', // 수정된 사항이 local에 일단 저장된다는 의미임.
editurl : './example.jsp',
//footerrow : true, // summary footer 사용함
//userDataOnFooter : true,

// jqGrid 함수 선언 영역
beforeSelectRow : function(rowid){}, // 사용자가 클릭한 순간 발생하며 rowid 값을 전달한다. true, false를 return 값으로 반환하여 다음 이벤트 실행여부를 결정한다.
onSelectRow : function(rowid, status){}, // 행의 선택 버튼을 눌렀을 때 발생하는 이벤트 처리를 위해 사용된다.
onCellSelect : function(rowid, iCol, cellcontent){}, // cell을 선택할 때마다 필요한 처리를 실행하기 위해 사용된다. 클릭이벤트시 rowid, columnindex, cell데이터가 입력된다.
ondblClickRow : function(rowid, iRow, iCol){}, // cell을 더블클릭시 발생하는 이벤트 처리를 위해 사용된다.
onRightClickRow : function(rowid, iRow, iCol){}, // 셀에서 마우스 오른쪽 버튼을 눌렀을 때 발생하는 이벤트 처리를 위해 사용된다.
afterEditCell : function(id,name,val,iRow,iCol){}, // Cell 수정 후 이벤트
afterSaveCell : function(rowid,name,val,iRow,iCol){}, // cell 저장 후 발생한다.
afterInsertRow : function(rowid){}, // addrow 이벤트가 발생한 뒤에 수행되는 이벤트를 정의한다.
rowattr : function(rowData, currentObj, rowid){}, // 행이 추가되는 순간 발생되는 이벤트를 위해 사용된다.
beforeProcessing : function(data, status, xhr){}, // 서버로부터 데이터를 받은 후 화면에 찍기 위한 processing을 진행기 직전에 호출된다. 넘어온 data와 status, xhr 등을 받아 성공했는지 여부에 대해 알 수 있다.
beforeRequest : function(){}, // 서버로 데이터를 요청하기 직전에 호출된다.
onHeaderClick : function(gridstate){}, // 캡션에서 그리드 숨기기/펼치기 버튼을 눌렀을 때 이벤트 처리를 위해 사용된다.
onSelectAll : function(aRowids, status){}, // 헤더의 선택 버튼을 눌렀을 때 발생하는 이벤트 처리를 위해 사용된다.
onSortCol : function(index, iCol, sortorder){}, // 헤더의 컬럼명을 눌러 정렬하는 경우 호출된다.
onPaging : function(pgButton){}, // 사용자가 페이징 관련 버튼을 눌렀을 때 이벤트를 호출한다. next, prev, first, last 버턴을 눌렀을 때 이벤트 처리를 한다.
resizeStart : function(event, index){}, // 컬럼의 사이즈를 변경하기 위해 선택하는 경우 발생되는 이벤트를 위해 사용된다.
resizeStop : function(newwidth, index){}, // 컬럼의 사이즈를 변경하고 선택을 취소할 때 발생되는 이벤트를 위해 사용된다.
gridComplete : function(){}, // grid가 모든 작업을 완료한 이후에 발생한다.
loadBeforeSend : function(xhr, settings){}, // xhr에 의해 서버로 요청이 들어가기 전에 호출된다. 요청전 헤더값 설정 등에 사용된다. 만약에 이 함수가 false를 리턴하면 요청이 취소된걸로 본다.
loadComplete : function(data){}, // 서버에 요청을 보낸 후 완료되면 호출된다.
loadError : function(xhr, status, error){}, // 요청 실패시에 호출된다.

// jsonReader 선언 영역
jsonReader : {
repeatitems : false,
total :"total",
page :"page",
records :"records",
rows :"rows"
}

-- 같은이름의프로시저있으면삭제

DROP PROCEDURE IF EXISTS cursor_test;

 DELIMITER $$

 CREATE PROCEDURE cursor_test()

BEGIN

         -- 반복문변수선언

         DECLARE done INTEGER DEFAULT 0;

         -- 커서에서사용할변수선언

         DECLARE v_aaa varchar(10);

         DECLARE v_bbb varchar(10);

         -- 커서에서사용할Select 테이블선언

         DEClARE openCursor CURSOR FOR SELECT aaa, bbb FROM testTable;

 

         -- 반복문핸들러선언

         DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;

 

         -- 커서오픈

         OPEN openCursor;

 

                  -- 반복문시작

                  read_loop: LOOP

 

                           -- 커서에서데이터가져옴

                           FETCH openCursor INTO v_aaa, v_bbb;

 

                           -- 반복문종료시조건

                           IF done THEN

                                   LEAVE read_loop;

                           END IF;

 

                           -- 조건에맞는데이터데이터찾아서변수에임시저장

                           Select @codeName := codeName  From codeTable Where codeCode = v_bbb;

 

                           -- 테이블에저장

                           insert into `insertTable` (`iCode`, `iCodeName`) values(v_bbb, @codeName);

 

             -- 반복문끝

                  END LOOP read_loop;

 

         -- 커서해제

         CLOSE openCursor;

END$$

DELIMITER ;

 -- 프로시저실행

CALL cursor_test();

'프로그래밍 > MS_SQL' 카테고리의 다른 글

MSSQL 테이블 COMMENT 보기  (0) 2015.04.29
MSSQL IDENTITY 값 재 설정  (0) 2015.04.27
MSSQL 자동 증가 시드값 가져오기  (0) 2015.04.27
sqlexpress 백업 및 복원  (0) 2015.04.24
mssql 파일 크기 줄이기  (0) 2015.04.14

아래 명령으로 폴더별 용량을 확인 할 수 있다.

du -sh /폴더명/* 

 create profile 명령을 사용하여 로그인을 시도할 경우에 허용된 실패횟수를 지정할 수 있을 뿐 아니라 유저계정이 잠금상태로 남아 있게 되는 시간도 지정할 수 있다.

 접속시에 일정 회수 이상 실패한 후 CONNECT를 시도하면 "ORA-28000: the account is locked"의 ERROR를 받게 된다.

 

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS;

 

OE 계정의 경우 LOCKED 이면서 EXPIRED 되어 있으니 우선 아래의 명령으로 LOCK을 풀어야 하는데 ALTER USER 명령을 사용한다.

 

ALTER USER OE ACCOUNT UNLOCK;

 

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS
  WHERE USERNAME = 'OE';

 

마지막으로 EXPIRED를 풀어야 하는데, 오라클의 관리자 계정으로 로그인 후

ALTER USER OE IDENTIFIED BY OE;

 

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS
  WHERE USERNAME = 'OE';

 

 

'프로그래밍 > Oracle' 카테고리의 다른 글

오라클 락 해제하기  (0) 2022.07.19
오라클에서 COMMENT 다는 법  (0) 2019.04.24
오라클 테이블스페이스 생성  (0) 2019.04.04
오라클 분석함수  (0) 2016.05.04
oracle hr 사용자 unlock  (0) 2016.01.25

 create profile 명령을 사용하여 로그인을 시도할 경우에 허용된 실패횟수를 지정할 수 있을 뿐 아니라 유저계정이 잠금상태로 남아 있게 되는 시간도 지정할 수 있다.

 접속시에 일정 회수 이상 실패한 후 CONNECT를 시도하면 "ORA-28000: the account is locked"의 ERROR를 받게 된다.

 

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS;

 

OE 계정의 경우 LOCKED 이면서 EXPIRED 되어 있으니 우선 아래의 명령으로 LOCK을 풀어야 하는데 ALTER USER 명령을 사용한다.

 

ALTER USER OE ACCOUNT UNLOCK;

 

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS
  WHERE USERNAME = 'OE';

 

마지막으로 EXPIRED를 풀어야 하는데, 오라클의 관리자 계정으로 로그인 후

ALTER USER OE IDENTIFIED BY OE;

 

SELECT USERNAME,
             ACCOUNT_STATUS,
             TO_CHAR(LOCK_DATE,'YYYY.MM.DD HH24:MI') LOCK_DATE          
    FROM DBA_USERS
  WHERE USERNAME = 'OE';

 

 

'프로그래밍 > Oracle' 카테고리의 다른 글

오라클 락 해제하기  (0) 2022.07.27
오라클에서 COMMENT 다는 법  (0) 2019.04.24
오라클 테이블스페이스 생성  (0) 2019.04.04
오라클 분석함수  (0) 2016.05.04
oracle hr 사용자 unlock  (0) 2016.01.25

+ Recent posts