Lütfen MySQL 5.0 Sertifika Eğitim Kılavuzunun ne olduğuna dikkat edin.
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, test
potansiyel 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
Test
farklıdır test
, ancak Windows'ta çalışan MySQL için hala sorunlu)
mysql.db
Masaya dayanan bu ince kuralı hatırlamanız gerekecek . Bunu hatırlamıyorsanız, test
adı 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ü? USAGE
Ayrı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.
mysql_secure_installation
yeni bir yükleme çalıştırdım , bu da adsız kullanıcıları kaldırıyor.