| Table of Contents | ||
|---|---|---|
|
개요
...
DB 보안 점검 및 조치 방법에 대한 가이드입니다.
...
ALTIBASE HDB 설치 시 생성되는 사용자 디폴트 패스워드는 아래와 같습니다.
USER | PASSWORD |
|---|---|
SYSsys | MANAGERmanager |
데이터베이스에 접속하여 디폴트 패스워드 사용 여부를 확인합니다.
| Code Block | ||
|---|---|---|
| ||
iSQL> CONNECT SYSsys/MANAGERmanager; Connect success. |
조치 방법
디폴트 패스워드로 접속이 가능하다면 어플리케이션과의 연관성 확인 후 해당 사용자의 패스워드를 변경합니다.
| Code Block | ||||
|---|---|---|---|---|
| ||||
iSQL> ALTER USER user1sys IDENTIFIED BY password1234$; Alter success. $ALTIBASE_HOME/conf 디렉토리 밑에 altipasswd 실행 후 패스워드 변경 |
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
$ chmod 600 $ALTIBASE_HOME/conf/altibase.properties |
Log Anchor,
...
Log File,
...
Data File 접근 권한 설정
...
ALTIBASE HDB 데이터베이스 운용에 중요 파일인 하나인 Log Anchor, LogfileLog File, Datafile Data File 파일을 악의적인 의도로 변경하면 데이터베이스 장애가 발생할 수 있습니다.
...
logs, dbs 디렉토리 권한 설정을 700 또는 750 으로 한다.
Log Anchor, LogfileLog File, Datafile Data File 파일 권한 설정을 600 또는 640 으로 설정한다.
...
6.5.1 버전 이상부터 트레이스 로그파일에 대해서 TRC_ACCESS_PERMISSION 프로퍼티로 권한 설정이 가능합니다. 설정 후 DB 재 기동이 필요합니다.
| Code Block | ||||
|---|---|---|---|---|
| ||||
$> vi $ALTIBASE_HOME/conf/altibase.properties
TRC_ACCESS_PERMISSION = 640 # 속성 추가
$> server restart |
| Code Block | ||||
|---|---|---|---|---|
| ||||
만약 데이터베이스에 접속하는 사용자 중에 다른 그룹에 속한 사용자가 IPC 방식으로 접속할 계획이 있는 경우, |
...
altibase_ipc.log |
...
파일의 권한 설정을 변경할 때 주의가 필요합니다. 권한을 잘못 설정하면 해당 사용자가 IPC로 데이터베이스에 연결하지 못하는 문제가 발생할 수 있습니다. |
iSQL 명령 쉘 히스토리 검사
...
iSQL을 사용하여 데이터베이스에 접속 할 때 계정 및 패스워드를 함께 입력하면 쉘 히스토리 파일에 기록이 남기 때문에 패스워드가 유출될 수 있습니다.
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
$ isql -u sys -p manager -s 127.0.0.1 -port 31109 # 이와 같이 접속하면 사용자 이름과 패스워드가 노출될 수 있습니다. # 아래와 같이 iSQL 명령만 수행 한 후 계정 및 패스워드를 개별 입력하도록 합니다. $ isql … Write Server Name (default:127.0.0.1) : Write UserID : sys Write Password : ISQL_CONNECTION = TCP, SERVER = 127.0.0.1, PORT_NO = 20300 iSQL> |
쉘 히스토리 파일 보호를 위하여 접근 권한을 권한이 설정되어 있지 않다면 600으로 설정합니다.
| Code Block | ||
|---|---|---|
| ||
$ ls -al ~/*.*history
$ chmod 600 ~/.*history |
DBMS 보안 설정
...
PUBLIC SYNONYM은 데이터베이스 사용 편의를 위해 자동으로 생성되는 객체입니다.
이들은 DUAL 테이블 조회, PRINT 또는 PRINTLN 같은 프로시저 내에서 널리 사용되므로 삭제를 권장하지 않습니다.
하지만 부득이하게 삭제해야 할 경우, 운영자 및 개발자와 충분히 협의한 후 아래 DROP 하시기 바랍니다.
| Code Block | ||||
|---|---|---|---|---|
| ||||
DROP PUBLIC SYNONYM synonym_name; |
...
이러한 상황에서는 PUBLIC이 아닌 PRIVATE SYNONYM을 생성하시면 됩니다.
PRIVATE SYNONYM 을 생성하기 위해서는 해당 계정으로 로그인한 후 PRIVATE SYNONYM을 생성할 수 있습니다로그인 후 synonym 을 생성하면 됩니다.
| Code Block | ||||
|---|---|---|---|---|
| ||||
connect user_id/user_passwd; CREATE SYNONYM PRINT FOR synonym_name; -- 아래 세 개의 SYNONYM은 sys 계정만 실행 가능합니다. CREATE SYNONYM SET_SYSTEM_STATS FOR SYSTEM_.SET_SYSTEM_STATS; CREATE SYNONYM GATHER_SYSTEM_STATS FOR SYSTEM_.GATHER_SYSTEM_STATS; CREATE SYNONYM GATHER_DATABASE_STATS FOR SYSTEM_.GATHER_DATABASE_STATS; |
...
- ALTIBASE HDB 4.3.9.211 부터
- ALTIBASE HDB 5.3.3.89 부터
- ALTIBASE HDB 5.5.1.5.1 부터
- ALTIBASE HDB 6.1.1.2.1 부터
- ALTIBASE HDB 6.3.1
- ALTIBASE HDB 6.5.1
- ALTIBASE HDB 7.1
- ALTIBASE HDB 7.3
- 이상 모든 버전
점검 방법
| Code Block | ||||
|---|---|---|---|---|
| ||||
-- SELECT USER_NAME, FAILED_LOGIN_ATTEMPTS, 은 -- 접속 실패 수가 설정 값을 초과하는 경우 해당 사용자의 패스워드가 잠김. -- PASSWORD_LOCK_TIME 는 -- 패스워드 잠금 기간(일)을 의미. -- 0인 경우 설정되어 있지 않음을 의미. SELECT USER_NAME, FAILED_LOGIN_ATTEMPTS, PASSWORD_LOCK_TIME FROM SYSTEM_.SYS_USERS_; |
조치 방법
...
| title | 관련 프로퍼티 설정 |
|---|
...
$ALTIBASE_HOME/conf/altibase.properties
...
에서
...
FAILED_LOGIN_ATTEMPTS,
...
PASSWORD_LOCK_TIME
...
프로퍼티
...
추가
...
후
...
ALTIBASE
...
HDB
...
서버를
...
재
...
시작
...
합니다.
...
이
...
프로퍼티
...
설정
...
후
...
데이터베이스
...
사용자를
...
생성하면
...
이
...
값을
...
기준으로
...
패스워드
...
잠김이
...
설정됩니다.
...
| Code Block | ||
|---|---|---|
| ||
SELECT NAME, VALUE1 FROM V$PROPERTY WHERE NAME IN ('FAILED_LOGIN_ATTEMPTS', 'PASSWORD_LOCK_TIME');
|
...
- ALTIBASE HDB 4.3.9.211 부터
- ALTIBASE HDB 5.3.3.89 부터
- ALTIBASE HDB 5.5.1.5.1 부터
- ALTIBASE HDB 6.1.1.2.1 부터
- ALTIBASE HDB 6.3.1
- ALTIBASE HDB 6.5.1
- ALTIBASE HDB 7.1
- ALTIBASE HDB 7.3
- 1 이상 모든 버전
점검 방법
| Code Block | ||||
|---|---|---|---|---|
| ||||
SELECT USER_NAME, PASSWORD_VERIFY_FUNCTION FROM SYSTEM_.SYS_USERS_; -- PASSWORD_VERIFY_FUNCTION 컬럼이 패스워드 복잡도 설정을 의미하며 -- NULL 인 경우 설정되어 있지 않음을 의미합니다. |
...
| Code Block | ||||
|---|---|---|---|---|
| ||||
ALTER USER 사용자명 LIMIT (PASSWORD_VERIFY_FUNCTION 사용자 콜백함수); -- 수행 예 ALTER USER user1 LIMIT (PASSWORD_VERIFY_FUNCTION pwd_verify_function); |
| Code Block | ||||
|---|---|---|---|---|
| ||||
CREATE OR REPLACE FUNCTION pwd_verify_function
( username varchar(20),
password varchar(20))
RETURN varchar(100)
AS
result varchar(100);
pwdLength integer;
isDigit boolean;
isChar boolean;
isPunctuation boolean;
digitArray varchar(20);
punctuationArray varchar(25);
charArray varchar(52);
BEGIN
digitArray := '0123456789';
charArray := 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
punctuationArray :='!"#$%&()``*+,-/:;<=>?_';
-- Check if the password is same as the username
IF LOWER(password) = LOWER(username) THEN
result := 'Password same as or similar to user';
RETURN result;
END IF;
-- Check for the minimum length of the password
IF LENGTH(password) < 4 THEN
result := 'Password length less than 4';
RETURN result;
END IF;
-- Check if the password is too simple.
IF LOWER(password) IN ('welcome', 'database', 'account', 'user', 'password', 'altibase', 'computer', 'abcd') THEN
result := 'Password too simple';
RETURN result;
END IF;
-- Check if the password contains at least one letter, one digit and one
-- punctuation mark.
-- 1. Check for the digit
isDigit := FALSE;
pwdLength := length(password);
FOR i IN 1...10 LOOP
FOR j IN 1...pwdLength LOOP
IF substr(password,j,1) = substr(digitArray,i,1) THEN
isDigit := TRUE;
GOTO findchar;
END IF;
END LOOP;
END LOOP;
IF isDigit = FALSE THEN
result := 'Password should contain at least one digit, one character and one punctuation';
RETURN result;
END IF;
-- 2. Check for the character
<<findchar>>
isChar := FALSE;
FOR i IN 1...length(charArray) LOOP
FOR j IN 1...pwdLength LOOP
IF substr(password,j,1) = substr(charArray,i,1) THEN
isChar := TRUE;
--GOTO findpunct;
END IF;
END LOOP;
END LOOP;
IF isChar = FALSE THEN
result := 'Password should contain at least one digit, one character and one punctuation';
RETURN result;
END IF;
-- 3. Check for the punctuation
<<findpunct>>
isPunctuation := FALSE;
FOR i IN 1...length(punctuationArray) LOOP
FOR j IN 1...pwdLength LOOP
IF substr(password,j,1) = substr(punctuationArray,i,1) THEN
isPunctuation := TRUE;
GOTO endsearch;
END IF;
END LOOP;
END LOOP;
IF isPunctuation = FALSE THEN
result := 'Password should contain at least one digit, one character and one punctuation';
RETURN result;
END IF;
<<endsearch>>
result := 'TRUE';
RETURN result;
END;
/ |
...
- ALTIBASE HDB 4.3.9.211
- ALTIBASE HDB 5.3.3.89
- ALTIBASE HDB 5.5.1.5.1
- ALTIBASE HDB 6.1.1.2.1
- ALTIBASE HDB 6.3.1
- ALTIBASE HDB 6.5.1
- ALTIBASE HDB 7.1
- ALTIBASE HDB 7.3
- 이상 모든 버전
점검 방법
| Code Block | ||||
|---|---|---|---|---|
| ||||
--select PASSWORD_LIFE_TIME 과 PASSWORD_GRACE_TIME 의 user_name, PASSWORD_LIFE_TIME, -- 값은 일 단위이며단위, 00인 인 경우 설정되어미설정 있지상태 않음을 의미합니다. select user_name, PASSWORD_LIFE_TIME, PASSWORD_GRACE_TIME -- 값은 일 단위, 0인 경우 미설정 상태 from system_.sys_users_; |
조치 방법 아래 명령어로 PASSWORD_LIFE_TIME 프로퍼티를 확인하여 값이 0 이라면 패스워드의 만료일이 설정되어 있지 않음을 의미합니다.
...
보안 패치
...
보안 패치 적용
...
Altibase 보안 패치는 고객지원서비스포털Altibase Performance Solutions(패치노트) 에서 확인할 수 있습니다.
- 보안관련 버그를 포함한 주요한 버그가 반영된 경우에 고객지원서비스포털에 신규 패치를 업로드 합니다.
...