MySQL: Neden mysql.db'de "test" girişi var?


36

Son zamanlarda, mysql.db ile ilgili bir soruya cevap gönderdi .

Sonra herkese bu soruyu sormam gerektiğini düşünmeliyim:

Yıllar boyunca MySQL 5.0+ kurulumunun ardından mysql.dbtest veritabanlarına isimsiz kullanıcılar tarafından erişilmesine izin veren iki giriş yerleştirildiğini fark ettim .

Bu sorguyu çalıştırarak görebilirsiniz:

mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
                 Host: %
                   Db: test
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
*************************** 2. row ***************************
                 Host: %
                   Db: test\_%
                 User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
           Grant_priv: N
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: N
         Execute_priv: N
2 rows in set (0.00 sec)

Bu girişler mysql.dbgüvenlik riski altında mı ve öyleyse neden varsayılan olarak yeni bir yüklemeye eklenmişler?

GÜNCELLEME 2013-06-14 10:13 EDT

Bu sabah biri, gerçekten anlamadığım sorumu reddetti. Bu olayın ışığında, işten çıkarma için zaman ayırmamın nedeni:

Bu hafta bir müşteriye MySQL 5.6.12'yi Aşama Kümesinde yükledim. Bunun hala devam eden bir sorun olup olmadığını kontrol etmeye karar verdim:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)

mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db      | user | host |
+---------+------+------+
| test    |      | %    |
| test\_% |      | %    |
+---------+------+------+
2 rows in set (0.10 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)

mysql>

Bil bakalım ne oldu? Bu hala bugün bile bir sorun !!!

HİKAYE SINIRI: Lütfen mysql.dbkurulumdan hemen sonra kontrol edin ve anonim girişleri kaldırın ve bu girişleri mysql.dbgecikmeden silin .


8
Bu konuyu gün ışığına çıkarmak için +1. Daha önce hiç farketmemiştim, ancak her zaman mysql_secure_installationyeni bir yükleme çalıştırdım , bu da adsız kullanıcıları kaldırıyor.
Derek Downey,

Yanıtlar:


30

Lütfen MySQL 5.0 Sertifika Eğitim Kılavuzunun ne olduğuna dikkat edin.

görüntü tanımını buraya girin

Madde işaretleri için bkz. Sayfa 498 Paragraf 6:

Unix'te MySQL, kurulumunuzda güvenlikle ilgili birçok yararlı işlemi gerçekleştirebilecek bir mysql_secure_installation betiğiyle birlikte gelir. Komut aşağıdaki yeteneklere sahiptir:

  • Kök hesaplar için bir şifre belirleyin
  • Uzaktan erişilebilen kök hesapları kaldırın.
  • Anonim kullanıcı hesaplarını kaldırın. Bu, güvenliği artırır, çünkü herhangi birinin MySQL sunucusuna uzak bir ana bilgisayardan root olarak bağlanma olasılığını önler. Sonuç olarak, root olarak bağlanmak isteyen herkes ilk önce sunucu ana bilgisayarında oturum açabilmelidir, bu da saldırıya karşı ek bir engel oluşturur.
  • Test veritabanını kaldırın (Anonim hesapları kaldırırsanız, erişebildikleri test veritabanını da kaldırmak isteyebilirsiniz).

Kötü girişlerden kurtulmak için lütfen şunu çalıştırın:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test';
FLUSH PRIVILEGES;

@DTest, soruya yaptığı yorumda belirtildiği gibi, bunun için mysql_secure_installation komutunu çalıştırabilirsiniz .

Anonim bir kullanıcı uzaktan MySQL'e giriş yapabilirse, mysql kurulumuna zarar vermek için basit bir disk saldırısı başlatılabilir. İşte bir örnek:

USE test
CREATE TABLE rolando_tb (a int);
INSERT INTO rolando_tb VALUES (1);
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;
INSERT INTO rolando_tb SELECT a FROM rolando_tb;

30 kez ek çalıştırın ve 7GB masa olsun

  • Test veritabanında bu tablolardan birkaçını oluşturduğunuzu düşünün
  • Test veritabanında Saklı Bir Prosedür oluşturduğunuzu hayal edin
  • Olasılıklar test ve test_% 'unun bulunduğu sürece sınırsız mysql.db

MySQL AB tarafından güvenlik altına almanın ciddiyeti tam olarak MySQL AB tarafından belgelenmemiştir ve Oracle'ın bugün bunu yapmakla ilgilenmediğini düşünüyorum.

GÜNCELLEME 2012-02-18 16:45 EDT

@ Atxdba'nın yorumunda, sadece 'DROP DATABASE testi çalıştıran'; mysql.db'ye dokunmak için tercih edilen yöntem olmalıdır. Adlandırılmış veritabanını bırakmak, testpotansiyel bir güvenlik deliğine bir kanal açan veritabanını kaldırır.

Lütfen bu sorguyu not edin:

mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.09 sec)

Buna dayanarak, aşağıdaki veritabanlarına isimsiz kullanıcılar tarafından tam olarak erişilebilir :

  • Ölçek
  • test_db
  • test_001
  • test_1
  • test verisi

Aşağıdaki veritabanlarına anonim kullanıcılar tarafından tam olarak erişilemiyor olsa da:

  • testdb
  • test1
  • test verisi
  • Test ( Linux tabanlı sistemlerden Testfarklıdır test, ancak Windows'ta çalışan MySQL için hala sorunlu)

mysql.dbMasaya dayanan bu ince kuralı hatırlamanız gerekecek . Bunu hatırlamıyorsanız, testadı verilen bir test veritabanı veya ilk 5 karakteri test_aynı olan güvenlik deliğini yeniden açacak bir veritabanı adı oluşturmak .

Bunları hatırlamak zorunda kalmanın en güvenli yolu, ilk kurulumdan sonra bu satırları çalıştırmaktır:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

daha sonra herhangi bir isimdeki herhangi bir veritabanı uygun bir doğrulama ayarına sahip olabilir. Hala bu iki çizgiyi istediğiniz zaman çalıştırabilirsiniz.

GÜNCELLEME 2012-02-24 15:20 EDT

Anonim kullanıcıların içeri girme tehlikesini açıkça göstermek için mysql.db, yalnızca kullanım ayrıcalığına sahip bir kullanıcı oluşturmak istiyorum.

Masaüstümde MySQL 5.5.12 kullanacağım

İlk önce, mysql.db'ye bakın.

mysql> select user,host,db from mysql.db;
+------+------+---------+
| user | host | db      |
+------+------+---------+
|      | %    | test    |
|      | %    | test\_% |
+------+------+---------+
2 rows in set (0.05 sec)


mysql>

Buna göre, herhangi bir isimsiz Joe bu veritabanlarına ulaşabilir.

Bir veritabanı oluşturacağım test_mysqldb

mysql> create database test_mysqldb;
Query OK, 1 row affected (0.00 sec)

mysql> use test_mysqldb
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql>

Vanilla @ localhost adında düz bir vanilya kullanıcısı oluşturalım (şifre yok)

mysql> CREATE USER vanilla@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GRANTS FOR vanilla@localhost;
+---------------------------------------------+
| Grants for vanilla@localhost                |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'vanilla'@'localhost' |
+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

Sonra, DOS Komut Satırı'ndan mysql şemasına bağlanalım.

C:\>mysql -uvanilla -Dmysql
ERROR 1044 (42000): Access denied for user 'vanilla'@'localhost' to database 'mysql'

C:\>

Tamam harika. Beklediğim bu.

Sonra, DOS Komut Satırı'ndan test_mysqldb şemasına bağlanalım, bir tablo oluşturalım ve sayılarla yükleyelim

C:\>mysql -uvanilla -Dtest_mysqldb
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE TABLE rolando_tb (a bigint unsigned);
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO rolando_tb VALUES (1);
Query OK, 1 row affected (0.06 sec)

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 1 row affected (0.06 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 4 rows affected (0.06 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> INSERT INTO rolando_tb SELECT * FROM rolando_tb;
Query OK, 8 rows affected (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM rolando_tb;
+------+
| a    |
+------+
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
|    1 |
+------+
16 rows in set (0.00 sec)

mysql> SELECT database();
+--------------+
| database()   |
+--------------+
| test_mysqldb |
+--------------+
1 row in set (0.00 sec)

mysql>

Şunu gördün mü? USAGEAyrıcalıklıbir kullanıcı,test veritabanında bir tablo oluşturabilir ve verilerle doldurabilir. Bu açık ve mevcut bir tehlike . Bu nedenle,anonim kullanıcıların test veritabanlarına ulaşmasını veya yeni oluşturulan test veritabanlarına erişmesini (varsayılanın altında bir alt klasör oluşturarak) caydırmak için bu test girişlerini mysql.db'den silmenizi şiddetle tavsiye ediyorumdatadir .

Bir hatırlatıcı olarak, bunu nasıl yaparsınız:

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

GÜNCELLEME 2013-09-14 20:05 EDT

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';Gerçekten çalıştığını göstermek için, bugün MySQL 5.6.13'te bunu yaptım:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db      | user | host |
+---------+------+------+
| test    |      | %    |
| test\_% |      | %    |
+---------+------+------+
2 rows in set (0.43 sec)

mysql> delete from mysql.db where LEFT(db,4)='test';
Query OK, 2 rows affected (0.04 sec)

mysql> select db,user,host from mysql.db2 where LEFT(db,4)='test';
Empty set (0.00 sec)

mysql>

Tıpkı bir kamu hizmeti duyurusu olarak lütfen çalıştırın

DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
FLUSH PRIVILEGES;

veya sadece mysql ile güvenli kurulumu çalıştırın ve bu olası tehlikeyi yatağa koyun.


Veritabanı testi bırakılmaz; doğrudan mysqldb ile kıpırdanmak yerine mi tercih edilir? Girişi db tablosundan silmek, gerçek test db dizinini kaldırmaz. Başka hiçbir şey sadece daha iyi ev tutmak gibi görünüyorsa
atxdba

1
DELETE from mysql.db WHERE Db LIKE 'test%';Alan adının büyük harf kullanımı ile ilgili önemli bir not almalıydım. Bu nedenle, alan adınız Dbve değilse db , yukarıdaki sorgu çalışmaz.
Avery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.