보안 이슈가 하루..이틀 전 얘기도 아니고,,
요새 왜 이리 말들이 많은지.. 언론을 통해 언급될때마다 너무 신경쓰이네요.. @@
암튼,, 그동안 미루었던 리스너 패스워드 설정 및 외부 IP 차단 작업을 마쳤습니다.
한달전부터 사전 준비작업 하면서,, 이것저것 많이 보기는 했는데,,
역시나 오라클 사이트에서 제공하는 레퍼런스가 짱인듯!! 예제며,, 설명이며 쉽게 정리 잘해놨네요..
Arup Nanda 가 2006년 5월에 작성한,,
'프로젝트 Lockdown (데이터베이스 인프라스트럭처의 보안을 위한 단계별 접근법)'은 주기별로
1단계 부터 4단계까지 외부침해요인을 제거하기 위한 여러가지 방안에 대해 자세하게 설명하고 있습니다.
이제 막 오라클 보안에 신경쓰는 분들이 보면 괜찮을 듯 하네요. 역시나 예제 샘플 넘 맘에 듭니다. ^^
그 자료 중에 리스너 패스워드 설정 부분만 캡쳐했습니다.
더 많은 정보는 아래 URL 링크를 통해 확인해보세요!!
출처: http://www.oracle.com/technology/global/kr/pub/articles/project_lockdown/phase1.html#1.6
1.6 Listener 패스워드의 생성
배경 정보
해커들이 가장 즐겨 사용하는 트릭 중 하나가 대량의 텍스트를 리스너로 전달하여 실행을 강제 종료하도록 유도하는 것입니다. 이 경우 데이터베이스는 여전히 실행 중이지만 리스너가 다운되기 때문에 새로운 연결을 생성할 수 없게 되므로, “서비스 거부(denial of service)” 공격이 가능합니다.
해커는 이를 위해 리스너의 속성 변경을 시도할 수 있습니다. 이를 위해 services 커맨드를 이용하여 리스너에 의해 처리되는 서비스의 목록을 조회하는 방법이 자주 사용됩니다. 아래 실행 예에서 볼 수 있는 것처럼 해커에게 필요한 충분한 수준의 정보가 제공되고 있음을 확인할 수 있습니다.
LSNRCTL> set displaymode verbose
LSNRCTL> services
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)
(HOST=prolin1.proligence.com)(PORT=1521)(IP=FIRST)))
Services Summary...
Service "PROPRD" has 1 instance(s).
Instance "PROPRD1", status READY, has 1 handler(s) for this
service...
Handler(s):
"DEDICATED" established:0 refused:0 state:ready
LOCAL SERVER
(ADDRESS=(PROTOCOL=BEQ)(PROGRAM=/u01/oracle/products/10.1/db1/bin/ora
cle)(ARGV0=oraclePROPRD11)(ARGS='(LOCAL=NO)')(ENVS='_=/u01/oracle/pro
ducts/10.1/db1/bin/racgmain,_USR_ORA_CONNECT_STR=/ as
sysdba,_CAA_CHECK_INTERVAL=600,SHLIB_PATH=/u01/oracle/products/10.1/d
b1/lib32:/u01/oracrs/10gr1crs/lib32:/opt/nmapi/nmapi2/lib/hpux32:,_CA
A_ACTIVE_PLACEMENT=0,PATH=,_USR_ORA_ALERT_NAME=,_USR_ORA_IF=,_CAA_OPT
IONAL_RESOURCES=,_USR_ORA_START_TIMEOUT=0,ORACLE_BASE=/u01/oracle/pro
ducts/10.1/db2,_USR_ORA_DISCONNECT=false,_CAA_SCRIPT_TIMEOUT=600,_CAA
_UPTIME_THRESHOLD=7d,_USR_ORA_STOP_TIMEOUT=0,_CAA_FAILOVER_DELAY=0,_U
SR_ORA_PRECONNECT=none,_USR_ORA_FLAGS=,_CAA_TYPE=application,_USR_ORA
_INST_NOT_SHUTDOWN=,_CAA_REASON=boot,INIT_STATE=3,_USR_ORA_OPEN_MODE=
,_CAA_STATE=:OFFLINE,,_CAA_RESTART_ATTEMPTS=5,_CAA_ACTION_SCRIPT=/u01
/oracle/products/10.1/db1/bin/racgwrap,_CAA_DESCRIPTION=CRS
application for
Instance,_CAA_HOSTING_MEMBERS=prolin1,ORA_RACG_EXEC_ENV=LD_LIBRARY_PA
TH=/u01/oracle/products/10.1/db1/lib:/u01/oracrs/10gr1crs/lib:/opt/nm
api/nmapi2/lib/hpux64:/usr/lib:,_CAA_CLIENT_LOCALE=,_CAA_NAME=ora.PRO
PRD1.PROPRD11.inst,ORA_CRS_HOME=/u01/oracrs/10gr1crs,_CAA_AUTO_START=
1,_CAA_TARGET=:ONLINE,,_USR_ORA_PFILE=,_USR_ORA_OPI=false,_USR_ORA_CH
ECK_TIMEOUT=0,_CAA_PLACEMENT=restricted,_USR_ORA_LANG=,LD_LIBRARY_PAT
H=/u01/oracle/products/10.1/db1/lib:/u01/oracrs/10gr1crs/lib:/opt/nma
pi/nmapi2/lib/hpux64:/usr/lib:,_CAA_REQUIRED_RESOURCES=ora.prolin1.vi
p,_CAA_FAILURE_THRESHOLD=0,ORACLE_HOME=/u01/oracle/products/10.1/db1,
_USR_ORA_SRV=,PWD=/u01/oracrs/10gr1crs/bin,_USR_ORA_VIP=,_USR_ORA_STO
P_MODE=immediate,_CAA_FAILURE_INTERVAL=0,_USR_ORA_NETMASK=,_USR_ORA_D
EBUG=0,ORACLE_SID=PROPRD1,ORA_NET2_DESC=9,12,ORACLE_SPAWNED_PROCESS=1
')(ENV_POLICY=NONE))
또 다른 해킹 유형으로 리스너를 셧다운하는 방법이 있습니다. 새로운 연결은 거부되며, 따라서 실질적인 서비스 거부 공격이 가능합니다. 또는 다른 서버에 먼저 침입한 후 리스너의 원격 관리 기능을 이용하여 리스너를 원격에서 종료하는 방법이 가능합니다. 이러한 위협으로부터 데이터베이스를 보호하려면 어떻게 해야 할까요?
전략
최선의 대안은 tnslsnr, lsnrctl 실행 파일의 소유자를 제외한 모든 권한을 제거하는 것입니다. (이 방법은 앞 섹션에서 설명한 바 있습니다.) 이러한 방법으로 오라클 소프트웨어의 소유자를 제외한 어느 누구도 리스너를 시작 또는 종료할 수 없도록 통제할 수 있습니다. 실행 파일의 권한은 아래와 같이 설정됩니다.
-rwx------ 1 orasoft oinstall 214720 Oct 25 01:23 lsnrctl -rwx------ 1 orasoft oinstall 1118816 Oct 25 01:23 tnslsnr
경우에 따라 리스너의 시작/종료 권한을 다른 사용자에게 허용해야 할 수도 있습니다. 이러한 경우라면 아래와 같이 권한을 변경해 주어야 합니다.
$ chmod 0711 lsnrctl
하지만 이와 같은 경우라 하더라도 패스워드 정책을 통해 불법적인 침입을 차단할 수 있어야 합니다. 패스워드를 설정하면 (HELP와 같은 무해한 명령을 제외한) 모든 커맨드가 비활성화됩니다.
패스워드를 설정하는 방법은 버전에 관계없이 동일합니다. 하지만 그 적용 메커니즘은 버전에 따라 다릅니다:
- Oracle9i Database Release 2 및 이전 버전에서는 모든 사용자가 패스워드를 입력해야 합니다.
- Oracle Database 10g Release 1 및 이후 버전에서는 데이터베이스 소프트웨어를 소유한 OS 사용자는 패스워드를 입력할 필요가 없습니다. 다른 모든 사용자는 패스워드를 필요로 합니다.
패스워드의 설정 방법이 아래와 같습니다:
$ lsnrctl
LSNRCTL> change_password
Old password: <OldPassword> Not displayed
New password: <NewPassword> Not displayed
Reenter new password: <NewPassword> Not displayed
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prolin1)(PORT=1521)(IP=FIRST)))
Password changed for LISTENER
The command completed successfully
패스워드를 처음으로 설정하는 경우, “Old Password”를 묻는 프롬프트에서 그냥 ENTER 키를 눌러도 됩니다. 변경 사항을 적용한 뒤 그 결과를 매개변수 파일에 저장합니다:
LSNRCTL> save_config
위 커맨드는 패스워드를 암호화하여 리스너 매개변수 파일에 저장합니다. 그 내용은 나중에 확인이 가능합니다:
#----ADDED BY TNSLSNR 24-OCT-2005 17:02:28--- PASSWORDS_LISTENER_ODSSDB01 = 75CD180DE6C75466 #--------------------------------------------
이제 커맨드를 사용하려면 패스워드를 입력해야 합니다 (Oracle Database 10g 및 이후 버전에서는 소프트웨어를 소유한 OS 사용자는 패스워드를 입력할 필요가 없습니다.)
LSNRCTL> services Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) TNS-01169: The listener has not recognized the password
패스워드를 입력하는 방법이 아래와 같습니다:
LSNRCTL> set password mypassword
The command completed successfully
LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
...
잘못된 패스워드가 입력되면 아래와 같은 에러가 뜹니다.
TNS-01169: The listener has not recognized the password.
패스워드를 입력하지 않고 명령을 실행하면 아래와 같은 에러가 뜹니다.
TNS-01190: The user is not authorized to execute the requested listener command
패스워드가 적용되었는지 확인하기 위해서는 아래와 같이 실행하여 리스너의 STATUS 설정을 조회합니다:
$ lsnrctl status
출력 결과는 버전에 따라 다릅니다. Oracle9i Database 환경의 실행 결과 중 일부가 아래와 같습니다:
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Solaris: Version 9.2.0.6.0 - Production
Start Date 25-OCT-2005 10:26:47
Uptime 0 days 13 hr. 8 min. 36 sec
Trace Level off
Security ON
마지막 라인(Security ON)에서 패스워드가 설정되었음을 확인할 수 있습니다.
Oracle Database 10g에서는 설정 방법이 조금 다릅니다. 10g의 경우 오라클 소프트웨어의 소유자만이 패스워드 없이 리스너를 실행할 수 있도록 설정되어 있습니다. 따라서 패스워드가 설정된 경우, 다른 사용자들은 패스워드를 입력한 경우에만 리스너의 실행이 가능합니다. STATUS 설정값의 확인 결과가 아래와 같습니다:
STATUS of the LISTENER
------------------------
Alias LISTENER_ODSPDB02
Version TNSLSNR for HPUX: Version 10.1.0.4.0 - Production
Start Date 16-OCT-2005 05:58:35
Uptime 9 days 17 hr. 44 min. 41 sec
Trace Level off
Security ON: Local OS Authentication
마지막 라인(ON: Local OS Authentication)에서 패스워드가 설정되지 않았음을 알 수 있습니다. 패스워드가 설정된 경우에는 아래와 같이 표시됩니다:
Security ON: Password or Local OS Authentication
“Password”라는 단어를 통해 패스워드가 설정되어 있음을 알 수 있습니다.
주의 사항
Oracle Database 10g 및 이후 버전에서는 특별히 주의할 사항이 없습니다. 사용자 인증을 위해 OS 인증이 사용되며 리스너의 시작/중단을 위해 패스워드를 입력할 필요가 없습니다. Oracle9i 및 이전 버전에서는 패스워드를 입력해 주어야 하며 따라서 스크립트에도 패스워드를 포함시켜야 합니다.
Action Plan
IF <Oracle Database 10g 및 이후 버전인 경우> THEN | |
소유자를 제외한 모든 사용자의 권한을 제거합니다. | |
ELSE | |
소유자를 제외한 모든 사용자의 권한을 제거합니다. 리스너의 패스워드를 설정합니다. | |
END IF |
'::: DB ::: > Oracle' 카테고리의 다른 글
[SQL] 레코드 중복 제거 (0) | 2009.09.01 |
---|---|
WARNING: Subscription for node down event still pending (0) | 2009.05.27 |
listener.ora Trace Parameters (0) | 2009.05.16 |
리스너 로그파일 초기화 (0) | 2009.05.08 |
TNS-12518: TNS:listener could not hand off client connection (0) | 2009.05.07 |