728x90

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

728x90

'프로그래밍 > 정보보안' 카테고리의 다른 글

HTTP trace 제거  (0) 2019.04.10
개인정보보호 보안 가이드 - 행정자치부  (0) 2015.04.23
728x90

/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

728x90

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

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

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"

728x90

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

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

$(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"
}

728x90
728x90

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

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();

728x90

'프로그래밍 > 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
728x90

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

du -sh /폴더명/* 

728x90
728x90

 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';

 

 

728x90

'프로그래밍 > 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
728x90

 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';

 

 

728x90

'프로그래밍 > 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