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 | +----------------------------------------+