• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 1. 일반적인 보안 문제
    2. MySQL 권한 시스템
    3. MySQL 사용자 계정 관리
    1. 사용자 이름과 암호
    2. 사용자 계정 추가
    3. 사용자 계정 삭제
    4. 계정 자원 제한 설정
    5. 계정 암호 지정
    6. 암호 만료 및 샌드 박스 모드
    7. 플러그 인증
    8. MySQL에서 사용 가능한 인증 플러그인
    9. 프록시 사용자
    10. 보안 연결을 위해 SSL 사용
    11. SSH를 사용하여 Windows에서 MySQL에 대한 원격 연결
    12. MySQL Enterprise Audit 로그 플러그인
    13. SQL 기반의 MySQL 계정 활동 감사
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

6.3.13 SQL 기반의 MySQL 계정 활동 감사

응용 프로그램은 다음 지침을 사용하여 데이터베이스 활동을 MySQL 계정에 연결 SQL 기반 감사를 수행 할 수 있습니다.

MySQL 계정은 mysql.user 테이블의 행에 대응합니다. 클라이언트가 성공적으로 연결되면 서버는이 테이블의 특정 행에 액세스하는 클라이언트를 인증합니다. 이 행의 User 와 Host 컬럼 값은 계정을 고유하게 식별하고 계정 이름이 SQL 문에 기록 된 ' user_name '@' host_name ' 형식을 지원합니다.

클라이언트를 인증하는 데 사용되는 계정은 클라이언트가 가지고있는 권한이 특정됩니다. 일반적으로 CURRENT_USER() 함수를 호출하면이 계정이 어떤 클라이언트 사용자인지를 확인할 수 있습니다. 그 값은 계정의 user 테이블 행의 User 와 Host 컬럼으로 구성되어 있습니다.

그러나 CURRENT_USER() 값이 클라이언트 사용자가 아닌 다른 계정에 해당하는 상황도 있습니다. 이것은 권한 체크가 클라이언트의 계정에 따라 실행되지 않는 상황에서 발생합니다.

  • SQL SECURITY DEFINER 특성을 사용하여 정의 된 스토어드 루틴 (프로 시저 및 함수)

  • SQL SECURITY DEFINER 특성을 사용하여 정의 된 뷰

  • 트리거 및 이벤트

이러한 맥락에서, 권한 체크는 DEFINER 계정과 일치하게 실행되고, CURRENT_USER() 는 해당 계정을 참조 스토어드 루틴 또는 뷰를 호출 한 클라이언트 또는 트리거를 활성화 한 클라이언트 계정은 참조하지 않습니다 . 클라이언트 및 클라이언트는 연결 호스트에 의해 지정된 실제 사용자 이름을 나타내는 값을 반환 USER() 함수를 호출하면 호출하는 사용자를 확인할 수 있습니다. 그러나 USER() 의 값에 와일드 카드가 포함되지 않는 반면, ( CURRENT_USER() 에 의해 반환되는) 계정 값은 사용자 이름과 호스트 이름의 와일드 카드가 될 수 있기 때문에이 값 반드시, user 테이블의 계정에 직접 대응한다고는 할 수 없습니다.

예를 들어, 빈 사용자 이름은 임의의 사용자에 일치하기 때문에 ''@'localhost' 계정을 사용하면 클라이언트는 임의의 사용자 이름이 로컬 호스트에서 익명 사용자로 연결할 수 있습니다. 이 경우 클라이언트가 로컬 호스트에서 user1 으로 연결된 경우, USER() 와 CURRENT_USER() 는 서로 다른 값을 반환합니다.

mysql> SELECT USER(), CURRENT_USER();
+-----------------+----------------+
| USER()          | CURRENT_USER() |
+-----------------+----------------+
| user1@localhost | @localhost     |
+-----------------+----------------+

계정의 호스트 이름 부분에 와일드 카드를 포함 할 수 있습니다. 호스트 이름에 '%' 또는 '_' 패턴 문자가 포함되어 있거나, 넷 마스크 표기가 사용되는 경우 여러 호스트에서 연결하는 클라이언트에 해당 계정을 사용할 수 있지만, CURRENT_USER() 의 값은 어떤 호스트인지가 표시되지 않습니다. 예를 들어, 계정 'user2'@'%.example.com' 를 사용하면 user2 가 example.com 도메인의 모든 호스트에서 연결할 수 있습니다. user2 가 remote.example.com 에서 연결하면 USER() 와 CURRENT_USER() 는 서로 다른 값을 반환합니다.

mysql> SELECT USER(), CURRENT_USER();
+--------------------------+---------------------+
| USER()                   | CURRENT_USER()      |
+--------------------------+---------------------+
| user2@remote.example.com | user2@%.example.com |
+--------------------------+---------------------+

응용 프로그램이 사용자를 감사하기 위해 USER() 를 호출 할 필요가 있지만 (예를 들어, 트리거 내에서 감사를 수행하는 경우), USER() 의 값을 user 테이블의 계정에 연결할 수있는 필요도있는 경우 계정의 User 또는 Host 컬럼에 와일드 카드가 포함되는 것을 방지해야합니다. 특히 User 를 (익명의 사용자 계정이 생성된다) 비워 둘은 허용하지 마십시오. 또한 Host 값에 패턴 문자 또는 넷 마스크 표기를 사용할 수도 허용하지 마십시오. 모든 계정에는 비어 있지 않은 User 값과 리터럴의 Host 값을 포함해야합니다.

위의 예를 들면, 와일드 카드가 사용되지 않도록 ''@'localhost' 및 'user2'@'%.example.com' 계정을 변경하도록하십시오.

 RENAME USER ''@ 'localhost'TO 'user1'@ 'localhost';
 RENAME USER 'user2'@'%.example.com'TO 'user2'@'remote.example.com';

user2 가 example.com 도메인에서 여러 호스트에서 연결해야하는 경우 호스트에 대해 별도의 계정으로해야합니다.

CURRENT_USER() 또는 USER() 의 값에서 사용자 이름 또는 호스트 이름 부분을 추출하려면 SUBSTRING_INDEX() 함수를 사용합니다.

mysql> SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',1);
+---------------------------------------+
| SUBSTRING_INDEX(CURRENT_USER(),'@',1) |
+---------------------------------------+
| user1                                 |
+---------------------------------------+

mysql> SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',-1);
+----------------------------------------+
| SUBSTRING_INDEX(CURRENT_USER(),'@',-1) |
+----------------------------------------+
| localhost                              |
+----------------------------------------+


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved