mysql_secure_installation.sh
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!/bin/sh
  2. # Copyright (C) 2002 MySQL AB and Jeremy Cole
  3. # This program is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2 of the License, or
  6. # (at your option) any later version.
  7. # This program is distributed in the hope that it will be useful,
  8. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10. # GNU General Public License for more details.
  11. # You should have received a copy of the GNU General Public License
  12. # along with this program; if not, write to the Free Software
  13. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14. config=".my.cnf.$$"
  15. command=".mysql.$$"
  16. trap "interrupt" 2
  17. rootpass=""
  18. prepare() {
  19.     touch $config $command
  20.     chmod 600 $config $command
  21. }
  22. do_query() {
  23.     echo $1 >$command
  24.     mysql --defaults-file=$config <$command
  25.     return $?
  26. }
  27. make_config() {
  28.     echo "# mysql_secure_installation config file" >$config
  29.     echo "[mysql]" >>$config
  30.     echo "user=root" >>$config
  31.     echo "password=$rootpass" >>$config
  32. }
  33. get_root_password() {
  34.     status=1
  35.     while [ $status -eq 1 ]; do
  36. stty -echo
  37. echo -n "Enter current password for root (enter for none): "
  38. read password
  39. echo
  40. stty echo
  41. if [ "x$password" = "x" ]; then
  42.     hadpass=0
  43. else
  44.     hadpass=1
  45. fi
  46. rootpass=$password
  47. make_config
  48. do_query ""
  49. status=$?
  50.     done
  51.     echo "OK, successfully used password, moving on..."
  52.     echo
  53. }
  54. set_root_password() {
  55.     stty -echo
  56.     echo -n "New password: "
  57.     read password1
  58.     echo
  59.     echo -n "Re-enter new password: "
  60.     read password2
  61.     echo
  62.     stty echo
  63.     if [ "$password1" != "$password2" ]; then
  64. echo "Sorry, passwords do not match."
  65. echo
  66. return 1
  67.     fi
  68.     if [ "$password1" = "" ]; then
  69. echo "Sorry, you can't use an empty password here."
  70. echo
  71. return 1
  72.     fi
  73.     do_query "UPDATE mysql.user SET Password=PASSWORD('$password1') WHERE User='root';"
  74.     if [ $? -eq 0 ]; then
  75. echo "Password updated successfully!"
  76. echo "Reloading privilege tables.."
  77. if ! reload_privilege_tables; then
  78.     exit 1
  79. fi
  80. echo
  81. rootpass=$password1
  82. make_config
  83.     else
  84. echo "Password update failed!"
  85. exit 1
  86.     fi
  87.     return 0
  88. }
  89. remove_anonymous_users() {
  90.     do_query "DELETE FROM mysql.user WHERE User='';"
  91.     if [ $? -eq 0 ]; then
  92. echo " ... Success!"
  93.     else
  94. echo " ... Failed!"
  95. exit 1
  96.     fi
  97.     return 0
  98. }
  99. remove_remote_root() {
  100.     do_query "DELETE FROM mysql.user WHERE User='root' AND Host!='localhost';"
  101.     if [ $? -eq 0 ]; then
  102. echo " ... Success!"
  103.     else
  104. echo " ... Failed!"
  105.     fi
  106. }
  107. remove_test_database() {
  108.     echo " - Dropping test database..."
  109.     do_query "DROP DATABASE test;"
  110.     if [ $? -eq 0 ]; then
  111. echo " ... Success!"
  112.     else
  113. echo " ... Failed!  Not critical, keep moving..."
  114.     fi
  115.     echo " - Removing privileges on test database..."
  116.     do_query "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%'"
  117.     if [ $? -eq 0 ]; then
  118. echo " ... Success!"
  119.     else
  120. echo " ... Failed!  Not critical, keep moving..."
  121.     fi
  122.     return 0
  123. }
  124. reload_privilege_tables() {
  125.     do_query "FLUSH PRIVILEGES;"
  126.     if [ $? -eq 0 ]; then
  127. echo " ... Success!"
  128. return 0
  129.     else
  130. echo " ... Failed!"
  131. return 1
  132.     fi
  133. }
  134. interrupt() {
  135.     echo
  136.     echo "Aborting!"
  137.     echo
  138.     cleanup
  139.     stty echo
  140.     exit 1
  141. }
  142. cleanup() {
  143.     echo "Cleaning up..."
  144.     rm -f $config $command
  145. }
  146. # The actual script starts here
  147. prepare
  148. echo
  149. echo
  150. echo
  151. echo
  152. echo "NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL"
  153. echo "      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!"
  154. echo
  155. echo
  156. echo "In order to log into MySQL to secure it, we'll need the current"
  157. echo "password for the root user.  If you've just installed MySQL, and"
  158. echo "you haven't set the root password yet, the password will be blank,"
  159. echo "so you should just press enter here."
  160. echo
  161. get_root_password
  162. #
  163. # Set the root password
  164. #
  165. echo "Setting the root password ensures that nobody can log into the MySQL"
  166. echo "root user without the proper authorisation."
  167. echo
  168. if [ $hadpass -eq 0 ]; then
  169.     echo -n "Set root password? [Y/n] "
  170. else
  171.     echo "You already have a root password set, so you can safely answer 'n'."
  172.     echo
  173.     echo -n "Change the root password? [Y/n] "
  174. fi
  175. read reply
  176. if [ "$reply" = "n" ]; then
  177.     echo " ... skipping."
  178. else
  179.     status=1
  180.     while [ $status -eq 1 ]; do
  181. set_root_password
  182. status=$?
  183.     done
  184. fi
  185. echo
  186. #
  187. # Remove anonymous users
  188. #
  189. echo "By default, a MySQL installation has an anonymous user, allowing anyone"
  190. echo "to log into MySQL without having to have a user account created for"
  191. echo "them.  This is intended only for testing, and to make the installation"
  192. echo "go a bit smoother.  You should remove them before moving into a"
  193. echo "production environment."
  194. echo
  195. echo -n "Remove anonymous users? [Y/n] "
  196. read reply
  197. if [ "$reply" = "n" ]; then
  198.     echo " ... skipping."
  199. else
  200.     remove_anonymous_users
  201. fi
  202. echo
  203. #
  204. # Disallow remote root login
  205. #
  206. echo "Normally, root should only be allowed to connect from 'localhost'.  This"
  207. echo "ensures that someone cannot guess at the root password from the network."
  208. echo
  209. echo -n "Disallow root login remotely? [Y/n] "
  210. read reply
  211. if [ "$reply" = "n" ]; then
  212.     echo " ... skipping."
  213. else
  214.     remove_remote_root
  215. fi
  216. echo
  217. #
  218. # Remove test database
  219. #
  220. echo "By default, MySQL comes with a database named 'test' that anyone can"
  221. echo "access.  This is also intended only for testing, and should be removed"
  222. echo "before moving into a production environment."
  223. echo
  224. echo -n "Remove test database and access to it? [Y/n] "
  225. read reply
  226. if [ "$reply" = "n" ]; then
  227.     echo " ... skipping."
  228. else
  229.     remove_test_database
  230. fi
  231. echo
  232. #
  233. # Reload privilege tables
  234. #
  235. echo "Reloading the privilege tables will ensure that all changes made so far"
  236. echo "will take effect immediately."
  237. echo
  238. echo -n "Reload privilege tables now? [Y/n] "
  239. read reply
  240. if [ "$reply" = "n" ]; then
  241.     echo " ... skipping."
  242. else
  243.     reload_privilege_tables
  244. fi
  245. echo
  246. cleanup
  247. echo
  248. echo
  249. echo
  250. echo "All done!  If you've completed all of the above steps, your MySQL"
  251. echo "installation should now be secure."
  252. echo
  253. echo "Thanks for using MySQL!"
  254. echo
  255. echo