2012-02-08 8 views
1

user @ host와 mysql.db 테이블에 대한 show grant의 차이점을 발견했습니다. 왜 이런거야?... MySQL Show Grants가 ... mysql.db 및 information_schema.schema_privileges와 다릅니다.

어떻게 해결할 수 있습니까? 우리는 보안에 대해 걱정하고 있습니다.

mysql.users에서 사용자에게 쇼 보조금을 제공했습니다. mysql.users에서 사용자는 [email protected]이고 show grant를 실행하면 [email protected]에게 사용 허가라고 표시됩니다.

이 사용자는 데이터베이스에 액세스 할 수 있습니다.

mysql.db 및 information_schema.schema_privileges를 보았을 때 해당 데이터베이스에 대한 전체 액세스 권한을 가진 xxx.xxx. % 호스트를 가진 사용자와 동일한 사용자를 볼 수 있습니다.

무엇을 제공합니까?

편집 - 깊은 설명 :

show grants for 'myuser'@'xxx.xxx.xxx.xxx'; 

그것은 반환 :

GRANT USAGE ON *.* TO 'myuser'@'xxx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx' 

내가 실행하는 경우 :

select host,db,user from mysql.db where user='myuser'; 

내가 얻을 여기

내가 가진 것입니다 :

+----------+------------+------------+ 
| host  | db   | user  | 
+----------+------------+------------+ 
|xxx.xxx.% | somedb  | myuser  | 
+----------+------------+------------+ 
+0

내 대답을 업데이트하지 않습니다입니다! – RolandoMySQLDBA

답변

3

걱정하지 마십시오.

mysql.user 테이블은 모든 데이터베이스에 대한 특정 글로벌 권한을 완화합니다.

사용자가 특정 데이터베이스로 제한되어있는 경우 mysql.db 테이블에만 데이터베이스 관련 권한이 표시됩니다. 데이터베이스로 제한된 사용자는 SUPER, PROCESS, SHUTDOWN 및 이와 같은 권한이 필요하지 않습니다.

전역 권한을 가진 사용자를 생성하여 (따라서 사용자를 mysql.user에 지정하면) 글로벌 권한 만 취소하여 사용자를 특정 데이터베이스로 강등시킬 수 없습니다. REVOKE 명령을 사용하려고하면 mysql.user에 사용자가 표시되고 모든 열에 원래 Y 값이 있고 mysql.db에 동일한 사용자가 있고 데이터베이스 특정 권한에 Y 값이 표시됩니다.

사용자를 완전히 삭제하고 더 낮은 권한으로 새로운 사용자를 만들어야합니다. 여기

은 GRANT 사용법은 단순히 당신이 (암호가 비어 있지 않은 경우) MD5 암호 인증과 관련된 어떤 알 수 있습니다 코멘트

mysql> show grants for [email protected]'%'; 
+-----------------------------------------------------------------------------+ 
| Grants for [email protected]%               | 
+-----------------------------------------------------------------------------+ 
| GRANT USAGE ON *.* TO 'advdb'@'%' IDENTIFIED BY PASSWORD '................' | 
| GRANT ALL PRIVILEGES ON `advertpro`.* TO 'advdb'@'%'      | 
+-----------------------------------------------------------------------------+ 

에 따라 예입니다. advdb는 모든 IP 주소에서 로그인 할 수 있으며 advertpro 데이터베이스에만 액세스 할 수 있습니다.

사용자는 프로세스 목록의 모든 프로세스 (다른 프로세스에 속한 프로세스조차도)를 보지 않으려면 PROCESS 특권이 필요하지 않습니다.

사용자가 읽기 전용 mysql 인스턴스에 쓰기, 복제 시작 및 중지, zap 바이너리 로그 및 이와 같은 것들을 쓰지 않는 한 사용자는 SUPER 권한이 필요하지 않습니다.

사용자가 OS 명령 줄 사용자 mysqladmin 클라이언트 프로그램에서 mysql을 종료하지 않으려면 사용자에게 SHUTDOWN 권한이 필요하지 않습니다.

당신이 찾고있는 PRIV을 복사하려면,

  • SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%';
  • 가 복사 텍스트 파일
  • 편집 호스트로 출력
  • 세미콜론을 추가 xxx.xxx.xxx.xx하는 ​​
  • 다른 서버에 붙여 넣기

확인하자. 그 대답 :

UPDATE mysql.db 
    SET host='xxx.xxx.xxx.xxx' 
    WHERE user='myuser' 
    AND host='xxx.xxx.%' 
    AND db='somedb'; 
FLUSH PRIVILEGES; 

이것은해야한다!

SQL에서 MySQL Grants를 덤프하려면 pt-show-grants pt-show-grants을 사용하여 mysql 권한을 포팅하는 것이 훨씬 더 좋습니다.

여기에 무엇을 PT-쇼 보조금의 개인 에뮬레이션

mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql 
+0

네,하지만 내 질문은, "쇼 부여"에만 사용자에게 데이터베이스에 대한 모든 권한이있는 것이 아니라 "사용 권한 부여"를 보여줍니다. * – Alienz

+0

특정 데이터베이스로 제한된 사용자에게 적합합니다. – RolandoMySQLDBA

+0

GRANT USAGE와 DB priv – RolandoMySQLDBA