本站已运行

攻城狮论坛

作者: 合肥清默
查看: 4290|回复: 34

主题标签Tag

more +今日重磅推荐Recommend No.1

所有IT类厂商认证考试题库下载所有IT类厂商认证考试题库下载

more +随机图赏Gallery

【新盟教育】2023最新华为HCIA全套视频合集【网工基础全覆盖】---国sir公开课合集【新盟教育】2023最新华为HCIA全套视频合集【网工基础全覆盖】---国sir公开课合集
【新盟教育】网工小白必看的!2023最新版华为认证HCIA Datacom零基础全套实战课【新盟教育】网工小白必看的!2023最新版华为认证HCIA Datacom零基础全套实战课
原创_超融合自动化运维工具cvTools原创_超融合自动化运维工具cvTools
重量级~~30多套JAVA就业班全套 视频教程(请尽快下载,链接失效后不补)重量级~~30多套JAVA就业班全套 视频教程(请尽快下载,链接失效后不补)
链接已失效【超过几百G】EVE 国内和国外镜像 全有了 百度群分享链接已失效【超过几百G】EVE 国内和国外镜像 全有了 百度群分享
某linux大佬,积累多年的电子书(约300本)某linux大佬,积累多年的电子书(约300本)
乾颐堂现任明教教主Python完整版乾颐堂现任明教教主Python完整版
乾颐堂 教主技术进化论 2018-2019年 最新31-50期合集视频(各种最新技术杂谈视频)乾颐堂 教主技术进化论 2018-2019年 最新31-50期合集视频(各种最新技术杂谈视频)
Python学习视频 0起点视频 入门到项目实战篇 Python3.5.2视频教程 共847集 能学102天Python学习视频 0起点视频 入门到项目实战篇 Python3.5.2视频教程 共847集 能学102天
约21套Python视频合集 核心基础视频教程(共310G,已压缩)约21套Python视频合集 核心基础视频教程(共310G,已压缩)
最新20180811录制 IT爱好者-清风羽毛 - 网络安全IPSec VPN实验指南视频教程最新20180811录制 IT爱好者-清风羽毛 - 网络安全IPSec VPN实验指南视频教程
最新20180807录制EVE开机自启动虚拟路由器并桥接物理网卡充当思科路由器最新20180807录制EVE开机自启动虚拟路由器并桥接物理网卡充当思科路由器

LAMP安全加固

  [复制链接]
查看: 4290|回复: 34
开通VIP 免金币+免回帖+批量下载+无广告
apache方面:6 k/ D) O' ^( x0 \
: O0 \( n3 W& ?# p9 F2 _
1.修改banner 编译源代码,修改默认的banner ServerTokens ProductOnly ServerSignature Off
+ T4 r# G+ ]  X6 q3 O' y在apache的源码包中找到ap_release.h将#define AP_SERVER_BASEPRODUCT “Apache” 修改为#define AP_SERVER_BASEPRODUCT “Microsoft-IIS/6.0” os/unix下的os.h文件#define PLATFORM “Unix”
8 ~3 s' ~1 e/ T2 }7 {, X修改为#define PLATFORM “Win32“
! G: _* v% N$ A/ _# c" a# b: L) d- t) }
2.修改默认的http状态响应码404,503等默认页面9 r6 q4 e8 f: Q/ |) Z0 m* G* ?5 o9 V

2 [1 O. w, J" k. L3.Apache的访问权限控制htpasswd -b -c /(存放密码文件路径)/
: B! Y1 u! V/ t; H7 _& ?1 Z3 d/ U.htpasswd username password Alias /hack “/var/www/html/hack/”
# z3 ^8 `: Q4 d8 d3 E( oauthname “test”authtype basic authuserfile /var/www/html/hack/.htpasswd require user kindle
: ?: `5 x6 L+ X7 Y# c8 ~( Z5 r( t" z3 n7 v% Q! o
4.关闭危险指令 清除FollowSymlinks指令 关闭索引目录Options Indexes FollowSymLinks
% K9 S  z2 K- Q关闭CGI执行程序
6 I) I+ {# x$ e5 Z, r! }0 a$ R; Q/ O/ S$ J; U' ]" y5 G
5.open_basedir 限制目录 用法:php_admin_value open_basedir
3 Q$ A' X' c# K. n2 P2 `! v/var/www php_admin_value open_basedir 引起的上传文件失败解决方法# v7 k; A9 B, o7 i
将上传文件的临时目录加入到php_admin_value open_basedir后面,最后看起来是这样的:
1 j8 R, k! m" C( f4 S& R8 Yphp_admin_value open_basedir “/usr/local/apache/htdocs/www/:/tmp/”
6 u( ^6 |0 T: ^: n注意:两个目录之间是冒号隔开。
0 p% V* V+ G) S把PHP脚本操作限制在web目录可以避免程序员使用copy函数把系统文件拷贝到web目录。$ r  |; D! b7 s/ t& L3 ~; h% t
move_uploaded_file不受open_basedir的限制,所以不必修改php.ini里upload_tmp_dir的值。
1 I1 h1 w8 S2 p5 |; |, ~0 j; {8 w5 D- A6 b
6.掌握Apache的Order Allow Deny判断原则  e$ x# ]3 S# V0 {! t" r

' P- L+ v6 f. J( i$ s1. 首先判断默认的;& z' Q3 a" s8 d+ }8 \6 y
6 u; }+ S- r# R  i5 s& r
2. 然后判断逗号前的;
% _3 J% C0 Q' {& J* A. b& U3 b  h/ h4 _
3. 最后判断逗号后的;
) I4 r( u) B3 J: ~: n! c* h% o; ]6 L- s0 m4 {: \
4. 最终按顺序叠加而得出判断结果。+ I6 W: s2 f5 N
ex: apache的php扩展名解析漏洞
& C4 ?/ i& r6 I, q/ \Order Allow,Deny Deny from all3 G. w& x; _" z
apache设置上传目录无执行权限
$ i. g1 U, \& S$ n! A4 \9 B4 Q% H& S0 D2 V
Order allow,deny Deny from all
6 q" H+ |; h3 }* y% l' ?  @# q- Y9 s2 {8 ~# K, e4 {
7.mod_rewrite重写URL 重写规则的作用范围0 F( f  y( h( z. z: p9 P
) M- k0 y5 C; m( o
1.使用在Apache主配置文件httpd.conf中。0 l- u! q/ o0 f) M4 ?0 Z

1 z0 P7 r- h" e; |2.使用在httpd.conf里定义的配置中。
4 R: F) ?6 q" a7 g; e$ u
. a' C$ ^7 K* R) q3.使用在基本目录的跨越配置文件.htaccess中。1.url重定向80到443端口8 p$ d4 I" A+ n1 @% S4 \7 b. U! E+ y
RewriteEngine on RewriteCond %{SERVER_PORT} !^443$) u" ?& }9 x- R
RewriteRule ^/?(.*)$ https://www.kindle.com/$1 [L,R]
5 @1 Z! t) X1 U7 D, B0 n, Y5 W2 H4 A含义是这样的:为了让用户访问传统的http://转到https://上来,
2 r4 ~( W4 ^1 ]: `用了一下rewrite规则: 第一句:启动rewrite引擎
: g; _" u* [6 @! T9 u' U9 A4 y第二句:rewrite的条件是访问的服务器端口不是443端口% Z6 s$ q% i: O
第三句:这是正则表达式,^是开头,$是结束,/?表示有没有/都可以(0或1个),
; A) ]  Y$ J# E, k(.*)是任何数量的任意字符 整句的意思是讲:启动rewrite模块,
* x7 H, p* S( S* I7 F将所有访问非443端口的请求,url地址内容不变,
. d  Q: R/ \2 {% o: ]4 i将http://变成https:// 9.Speling模块去除url大小写 确认speling模块存在并已加载) H( x, b7 w$ X/ C; I* i
启动speling4 @5 }: H5 _( B& u% h! M. u
CheckSpelling . AllowOverride None Order allow,deny Allow from all  H# c  q$ w0 @& d' v8 d1 @

* d" Z+ n% i6 m. o  H, [8 a, i9 B8. Limit模块限制IP连接数
1 K/ E# G( L% _7 J5 M, L  B' o9 q下载模块http://dominia.org/djao/limit/mod_limitipconn-0.04.tar.gz6 s: U9 p' i/ O# l) a6 F' m
安装: tar zxvf mod_limitipconn-0.04.tar.gz cd mod_limitipconn-0.04 make APXS=/usr/local/apache/bin/apxs
$ W* r. L9 v; `4 K% q: W  l' ?2 ^8 K- F9 c/ u, x* b/ y
这里要按你自己的路径设置make install APXS=/usr/local/apache/bin/apxs ???
9 \/ I5 g, D( p" Z+ ?3 `2 P7 T, q这里要按你自己的路径设置 编辑httpd.conf 添加% D3 k, u0 i& _1 T
全局变量: < IfModule mod_limitipconn.c > < Location / > #
  \9 \5 G& g) j1 L  e所有虚拟主机的/目录MaxConnPerIP 3 #4 \+ ?  ^9 I2 R* F/ X
每IP只允许3个并发连接NoIPLimit imageserver.* - ^% m- f9 @5 Y& J0 f+ ^- f/ h
删除默认或残留的服务器证书相关文件rpm -qa |grep openssl openssl genrsa -out www.kindle.com.key 1024 建立服务器密钥openssl req -new ?key www.kindle.com.key -out www.kindle.com.csr
' ~& p. g6 m! m- l建立服务器公钥openssl x509 -req -days 365 -in www.kindle.com.csr -signkey www.kindle.com.key -out www.kindle.com.crt
: R. Q: Q0 h5 @% |5 A/ ]# u建立服务器证书/etc/rc.d/init.d/httpd restart / x9 ]& e6 h5 o! T/ H
重启服务netstat -ntpl |grep 443 可以到http://www.startssl.com获取合法证书(免费)
/ g3 X2 x  N2 E1 c$ ~
& ^5 c" A* q" j1 {10.安装配置mod_security
# q* L! `" u8 D1 @9 w7 `下载:http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz http://fedoranews.org/jorge/mod_security/mod_security.conf& m1 p" P9 k  v
安装:下载到/opt/soft目录下。# tar ?zxvf modsecurity-1.8.7.tar.gz #3 V( G0 d, }6 p5 M
cd modsecurity-1.8.7 #cd apache2 # /opt/apache/bin/ apxs -cia mod_security.c #copy mod_security.conf /opt/apache/conf# L# I$ j, \4 e3 e
配置: 在/opt/apache/conf/httpd.conf中添加下面一行:0 O; Y- e* [$ G6 z( x$ Z
Include conf/mod_security.conf /opt/apache/bin/apachectl stop /opt/apache/bin/apachectl startssl  o% Q" W9 h1 X+ H2 t3 S* Q% s; m
% _* o0 w) U; N0 A3 n' k
更详细的mod_security的配置http://www.modsecurity.org/docum …ultipage/index.html7 s' h. h# A4 y$ c# n

: M% h. m1 ^/ t2 N3 o/ z$ w$ X, JPhp方面:
+ k# X" J0 ^9 M1 n7 e/ Z( u6 d

& M9 ]( A' L: r/ I" p1.打开php的安全模式php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,
: j4 T3 f0 ~+ Y  j& I) F比如passwd但是默认的php.ini是没有打开安全模式的,
$ i9 O; G  l2 M+ z/ O我们把它打开:safe_mode = on 当safe_mode打开时,safe_mode_gid被关闭,那么php脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。
# h7 u/ t) n4 P3 ^( J- q建议设置为:safe_mode_gid = off 如果不进行设置,
: W5 z( T5 K$ v4 T' J0 m可能我们无法对我们服务器网站目录下的文件进行操作了,比如我们需要对文件进行操作的时候。
. p) B6 q( A, {1 x# F0 p( N4 @6 W/ F# v+ t
2.安全模式下执行程序主目录 如果安全模式打开了,但是却是要执行某些程序的时候,
* v' r8 z8 U! _+ a+ S. U8 [! E可以指定要执行程序的主目录:safe_mode_exec_dir = D:/usr/bin 一般情况下是不需要执行什么程序的,
1 q+ u5 A# h' {$ i所以推荐不要执行系统程序目录,可以指向一个目录,然后把需要执行的程序拷贝过去,
( A5 `/ w' }9 |& j% R# G2 @7 s3 b% U比如:safe_mode_exec_dir = D:/tmp/cmd
- w1 v2 Y+ t2 t0 p6 [但是,我更推荐不要执行任何程序,那么就可以指向我们网页目录:safe_mode_exec_dir = D:/usr/www
7 f; {/ [& c. q: o# A0 u* D& S6 c" S# J4 r
3.安全模式下包含文件 如果要在安全模式下包含某些公共文件,那么就修改一下选项:safe_mode_include_dir = D:/usr/www/include/
4 ^  i% Q. A; z: Y3 C其实一般php脚本中包含文件都是在程序自己已经写好了,这个可以根据具体需要设置。
) f9 Z- q$ a8 T" G& j% U; u, A8 L( b* W+ J3 u- O% e7 V
4.控制php脚本能访问的目录 使用open_basedir选项能够控制PHP脚本只能访问指定的目录,
# S* X; Q! o' H- X8 n. [) o! [, U/ O这样能够避免PHP脚本访问.不应该访问的文件,一定程度上限制了phpshell的危害,
5 D# K% ?! p+ b& [8 p' [& f$ d9 a; T我们一般可以设置为只能访问网站目录:open_basedir = /var/www/html
/ h' j+ C8 f" [/ T/ {6 M3 s' M6 E5 h0 J# r, ]" X
5.关闭危险函数 如果打开了安全模式,那么函数禁止是可以不需要的,
( q# O1 x) b' z- R' R( b但是我们为了安全还是考虑进去。/ o4 N* k2 ]' k
比如,我们觉得不希望执行包括system()等在那的能够执行命令的php函数,
9 a. O& e/ r9 Q或者能够查看php信息的phpinfo()等函数,那么我们就可以禁止它们:
. \) V- E8 b2 w+ K3 Q: odisable_functions = system,passthru,exec,shell_exec,popen,phpinfo
: p2 }4 B2 `8 n7 _如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作
+ \$ B: r& e4 }4 c3 V, C- \disable_functions = phpinfo,exec,system,passthru,shell_exec,
8 u, c- M" ]- N' Tescapeshellarg,escapeshellcmd,8 T+ R/ p- h$ y6 B: u& g
proc_close,proc_open,dl,popen,show_source( F2 C% W1 h: ?8 I* ?. b; ~, V+ s
以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,
# O2 {  {' q: x就能够抵制大部分的phpshell了。
0 y3 r" _; ?, r, R5 w注:disable_classes可以禁用某些类,如果有多个用逗号分隔类名( b$ l4 \9 p+ ~, v% I
2 h0 @0 a7 X  M8 i; @: t
6.关闭PHP版本信息在http头中的泄漏 我们为了防止黑客获取服务器中php版本的信息,' f8 K! C! p& y6 o4 y6 X
可以关闭该信息斜路在http头中:expose_php = Off8 w; D( @5 J( F  j8 D, F
比如黑客在telnet www.12345.com 80 的时候,那么将无法看到PHP的信息。& H7 x6 N1 I0 v8 y4 a) g4 ]

$ Z7 F* J! G  y. h4 _- ^! m& [. a7.关闭注册全局变量 在PHP中提交的变量,包括使用POST或者GET提交的变量,
' R$ f0 Q5 Y' B5 I# z3 V8 V都将自动注册为全局变量,能够直接访问,这是对服务器非常不安全的,
# q4 D8 m, _7 R  N+ q9 v所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:" z  v  v* L+ a0 T# f; @7 n
register_globals = Off 当然,如果这样设置了,
: d' U" a3 q5 j4 N那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var,' f) _5 h% _  Y2 w
那么就要用$_GET['var']来进行获取,这个php程序员要注意。( q- _* o& l' c( \1 R7 l7 o) ~2 p6 n

# B; Q' w. q' u& Q8.打开magic_quotes_gpc来防止SQL注入SQL注入是非常危险的问题,
! O  j; ~% p3 F) F( M0 [4 Z小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。
2 n: ]" o! E4 }' C5 M) v. Kphp.ini中有一个设置:magic_quotes_gpc = Off 这个默认是关闭的,0 \/ ~4 V1 L4 z: S) r
如果它打开后将自动把用户提交对sql的查询进行转换,
) D9 h& f( L. f9 X! j4 E3 j比如把 ‘ 转为 ’等,这对防止sql注射有重大作用。
' o' m" E+ n* C所以我们推荐设置为:magic_quotes_gpc = On
3 ~5 \0 v, |4 O1 ]0 h5 F7 ~0 _" g! T" [
9.错误信息控制 一般php在没有连接到数据库或者其他情况下会有提示错误,# e2 c7 W* y# _$ B) _8 s6 j
一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息,8 \, T$ l& A" ^
这类信息提供给黑客后,是不安全的,: `' m8 N/ Z: k9 w" W! ~" }, I8 ~1 c: ]
所以一般服务器建议禁止错误提示:display_errors = Off 如果你却是是要显示错误信息,( y/ `4 n8 L1 j
一定要设置显示错误的级别,比如只显示警告以上的信息:+ F/ M8 Q- I9 r: S% _: a4 F+ q" Y
error_reporting = E_WARNING & E_ERROR. u) J* K3 E' P7 D4 y
当然,我还是建议关闭错误提示。
* s  B% v5 N( X5 I/ o) k7 B: [/ k' L, n1 O, T& l% y; ~/ V6 h2 c4 D# R
10.错误日志 建议在关闭display_errors后能够把错误信息记录下来# D" _: Z* c3 N0 C; R0 y0 U- k4 E
便于查找服务器运行的原因:log_errors = On
: p- ]( o+ L6 H: e: i& [: C同时也要设置错误日志存放的目录,8 q4 B! A) V0 P$ b2 _) Q5 g
建议根apache的日志存在一起:error_log = D:/usr/local/apache2/logs/php_error.log
; l( N2 k/ k, _- P/ k5 A- j. K$ G5 |% x5 d& V- b: A  d
注意:给文件必须允许apache用户的和组具有写的权限。0 j: D9 ]6 E% Y

: |& h. h2 ~- L11.关闭远程文件打开allow_url_fopen = off 防止黑客远程远程包含漏洞
& H) q$ r/ ]6 l: T" c( W5 k2 w+ `& e. B8 n  B/ U- d; Y7 k/ f
12.Php.ini包含补丁文件 在php.ini中引用。在配置文件内引用的话,将影响到所以的网站,1 H% R' d7 c8 s) r4 ~( L9 j
包含所有页面 在php.ini中,找到此节:
9 m$ H9 ]6 g6 z: |+ x; Automatically add files before or after any PHP document. ;auto_prepend_file = “phpids.php”;auto_append_file = “alert.php”
: I! z3 O- S5 u* s: }; D/ w$ m默认是空,请添加所包含的文件。; M) k! ~# g8 J. F
同时找到:; UNIX: “/path1:/path2″;include_path = “.:/php/includes”; ; Windows: “path1;path2″include_path = “.;F:PHPnowhtdocs”5 s3 Q! C- v: ^( l2 z' S
# c+ m! [, K- }5 `6 X( [
13.使用Suhosin保护PHP应用系统,
* g$ H" S: z+ K+ h7 d3 N, r具体参考 http://www.hardened-php.net/suhosin/configuration.html/ f3 g$ y" S( d: W, q% I1 q
& D$ j* K( S  R, E3 b
mysql方面:
3 s; A% B: N2 `8 ^! Z8 b

$ y8 \; Y7 m" N. m! o1.修改root用户口令,删除空口令 缺省安装的MySQL的root用户是空密码的,
# g) g, l" Y- _1 U为了安全起见,必须修改为强密码,所谓的强密码,至少8位,由字母、数字和符号组成的不规律密码。
) U, _! w$ H5 m% j7 Z1 q使用MySQL自带的命令mysaladmin修改root密码,同时也可以登陆数据库,
/ H4 L2 r3 J' O' S7 K+ i: F/ e修改数据库mysql下的user表的字段内容,修改方法如下所示:
. ^9 {$ j4 ^# i& ?) G/ _# /usr/local/mysql/bin/mysqladmin -u root password “upassword”//8 c6 W; U3 E' }+ D
使用mysqladmin #mysql> use mysql; #mysql>
2 J* ~, ^: d8 p3 q. Fupdate user set password=password(‘upassword’) where user=’root’;9 h$ @) S  S" z; C9 S: X
#mysql> flush privileges; //强制刷新内存授权表,否则用的还是在内存缓冲的口令
) B, }) F4 C% D/ R, _. ]: g8 `, [5 t# R# k) P) U8 n! w: E) U
2.删除默认数据库和数据库用户 一般情况下,MySQL数据库安装在本地,+ R/ |, b4 V; ^' y2 N9 V" X. {
并且也只需要本地的php脚本对mysql进行读取,所以很多用户不需要,尤其是默认安装的用户。% x# J  e5 y! }% j

$ n9 C0 h7 D& l4 rMySQL初始化后会自动生成空用户和test库,进行安装的测试,这会对数据库的安全构成威胁,. ^4 |3 _5 ?5 |0 e
有必要全部删除,最后的状态只保留单个root即可,当然以后根据需要增加用户和数据库。
7 y7 M/ s5 ]# m( ^0 l+ R' }0 J
+ A  q4 [+ N; e0 }$ c/ \#mysql> show databases; #mysql> drop database test; //删除数据库test
! G: v4 N# _& o% Z2 [2 C  S/ Y#use mysql; #delete from db; //删除存放数据库的表信息,因为还没有数据库信息。# t2 i$ q6 {0 c. |
#mysql> delete from user where not (user=’root’) ; // 删除初始非root的用户7 ^* w0 q# s$ y+ n
#mysql> delete from user where user=’root’and password=”; //- j) g7 ^( ]* a2 w) \) W4 z0 ~& u9 e
删除空密码的root,尽量重复操作Query OK, 2 rows affected (0.00 sec) #: ~$ l' y4 F. E6 C; r
mysql> flush privileges; //强制刷新内存授权表。
( u4 e% ^7 F& q. ]; C2 i4 L9 V
3 J5 B, T6 [6 Q* F1 L" W/ |
& Z; Q7 @" @- _% r: `3.改变默认mysql管理员帐号
* J1 [1 O( x2 k5 S+ G3 L7 G9 l5 s+ [9 W7 A% a  M2 Z
4.关于密码的管理 密码是数据库安全管理的一个很重要因素,不要将纯文本密码保存到数据库中。1 _( V5 H# _5 Z  Q& v4 X
如果你的计算机有安全危险,入侵者可以获得所有的密码并使用它们。
. g- ~, z: T, H相反,应使用MD5()、SHA1()或单向哈希函数。
- B7 j& s: k: _! C1 a# A也不要从词典中选择密码,有专门的程序可以破解它们,
% j- t% h2 {" p5 P" u& J- ?, z5 M请选用至少八位,由字母、数字和符号组成的强密码。在存取密码时,
# d' g2 @0 ^/ z3 T& G! G: H& c% s使用mysql的内置函数password()的sql语句,对密码进行加密后存储。
9 F7 s" A# T# z' V! l例如以下方式在users表中加入新用户。
! K( L; k, `2 M+ q3 z#mysql> insert into users values (1,password(1234),’test’);  d, T) d3 H, y' |) N0 D1 p8 f
/ y' P. E5 z. w0 I
5.使用独立用户运行msyql 绝对不要作为使用root用户运行MySQL服务器。; {0 i8 x- F! P) ~1 T9 }. P/ l6 ^
这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。; r, L7 s9 N( v! a; l5 Q
mysqld拒绝使用root运行,除非使用?user=root选项明显指定。应该用普通非特权用户运行mysqld。( o! B" P5 o1 M- S
正如前面的安装过程一样,为数据库建立独立的linux中的mysql账户,该账户用来只用于管理和运行MySQL。
" I, Q& e( k5 \7 u' r6 B3 f* x! S要想用其它Unix用户启动mysqld,,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。#vi /etc/my.cnf [mysqld] user=mysql0 k) m2 N  e8 U0 R
该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safe或mysql.server启动,
; j, V4 }3 V: e& k6 X  ?都能确保使用mysql的身份。3 y! u! ~; o( W4 g
也可以在启动数据库是,加上user参数。
' r( w0 f0 y% s, Q# /usr/local/mysql/bin/mysqld_safe ?user=mysql & 作为其它linux用户而不用root运行mysqld,  w$ u! X* Z% \7 {' M
你不需要更改user表中的root用户名,因为MySQL账户的用户名与linux账户的用户名无关。
* |5 x, k  W1 w: V2 L确保mysqld运行时,只使用对数据库目录具有读或写权限的linux用户来运行。( A* i" A# _* A' O; A

2 l' r6 z% P" f3 {& H  B此时打开了mysqld的网络监听,允许用户远程通过帐号密码连接数本地据库,1 R0 S0 a" [7 h* ^
默认情况是允许远程连接数据的。为了禁止该功能,启动skip-networking,不监听sql的任何TCP/IP的连接,切断远程访问的权利,保证安全性。假如需要远程管理数据库,1 `( F) k+ u* j! ~" ^' F  ^
可通过安装PhpMyadmin来实现。假如确实需要远程连接数据库,至少修改默认的监听端口,同时添加防火墙规则,只允许可信任的网络的mysql监听端口的数据通过。# vi /etc/my.cf 将#skip-networking注释去掉。# /usr/local/mysql/bin/mysqladmin -u root -p shutdown //停止数据库#/usr/local/mysql/bin/mysqld_safe ?user=mysql & //后台用mysql用户启动mysql$ e# P. G- c( g0 Z: G6 b
! Q* V4 M) d6 T, |6 g5 z6 F
7.限制连接用户的数量 数据库的某用户多次远程连接,6 h. J( L/ E( c
会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,8 V9 s( ^$ E9 w- v0 L- |; M
设置my.cnf文件的mysqld中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。#vi /etc/my.cnf [mysqld] max_user_connections 2
5 q3 w. V% r  s+ B4 N: C8 w2 Q$ o/ b: \1 E; w' e( U
8.用户目录权限限制 默认的mysql是安装在/usr/local/mysql,* u+ U) D1 ]% w$ l( k
而对应的数据库文件在/usr/local/mysql/var目录下,! ^1 ?& f$ h8 m0 k% U% |2 Q8 S' S
因此,必须保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,
7 }9 c- z0 I( ^8 s+ X1 Y所以要限制对该目录的访问。确保mysqld运行时,
; f! _4 S* U, d: s% g: E, S& I( z只使用对数据库目录具有读或写权限的linux用户来运行。# chown -R root /usr/local/mysql/ //
6 ^4 @$ A6 d( v2 o# f8 G+ W' B2 P; H2 q( v; Z3 s' k0 z: _# T
mysql主目录给root # chown -R mysql.mysql /usr/local/mysql/var //+ B( ]6 g! ~# W) I

' b: q* f9 U- S. _  P  i确保数据库目录权限所属mysql用户* k! p6 P& t# m. ^; E7 O
# m- u( m# T2 X5 l- e
9.命令历史记录保护 数据库相关的shell操作命令都会分别记录在.bash_history,+ a4 U# [& @# Q: t& @( Y! v

( Z7 s; Q# E% c! Z1 I0 W如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用update表信息来修改数据库用户密码的话,也会被读取密码,* Y& v, o$ ~3 v( e. v

. H! B: F. S" F$ }4 b因此需要删除这两个文件,同时在进行登陆或备份数据库等与密码相关操作时,
1 S* d# \8 U5 X9 r- u$ C8 [  G+ H; H6 l应该使用-p参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。& h9 Z) ?: l6 }! g, \( g9 M9 M
# rm .bash_history .mysql_history //5 y' B9 |  f9 a; H0 g. d
删除历史记录# ln -s /dev/null .bash_history //
$ `/ ^! p7 v3 {8 y" E: r将shell记录文件置空# ln -s /dev/null .mysql_history //将mysql记录文件置空+ F2 g( {5 _' s, s
% n& U! V% V6 m! N' S( _
10.禁止MySQL对本地文件存取 在mysql中,提供对本地文件的读取,使用的是load data local infile命令,默认在5.0版本中,该选项是默认打开的,该操作令会利用MySQL把本地文件读到数据库中,- V7 L$ |6 ]. w. o  L- k% ^' ^
然后用户就可以非法获取敏感信息了,假如你不需要读取本地文件,请务必关闭。) j2 h5 Y" I; C* \3 B
应该禁止MySQL中用“LOAD DATA LOCAL INFILE”命令。9 K4 x/ a/ P! Z; G
网络上流传的一些攻击方法中就有用它LOAD DATA LOCAL INFILE的,同时它也是很多新发现的SQL Injection攻击利用的手段!
+ d. B3 t- S" ~: L' R5 Y( v黑客还能通过使用LOAD DATALOCAL INFILE装载“/etc/passwd”进一个数据库表,' G$ Y. S% `! ?8 S/ X
然后能用SELECT显示它,这个操作对服务器的安全来说,是致命的。6 Q- L3 M# ?# I* u2 m
; Q& p4 A% ^" a* I- Y3 f) e
可以在my.cnf中添加local-infile=0,或者加参数local-infile=0启动mysql。#/usr/local/mysql/bin/mysqld_safe ?user=mysql ?local-infile=0 &" p: X- N% b3 l; m
#mysql> load data local infile ’sqlfile.txt’into table users fields terminated by ‘,’;! m- U& i6 C# {* `) m$ \
#ERROR 1148 (42000):4 `1 c# V( E% \' t' S9 i
The used command is not allowed with this MySQL version ?local-infile=0
% @# j; G& ]% ^' d! o( X选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令,假如需要获取本地文件,
9 Y4 e( I# b7 r" e; O: d需要打开,但是建议关闭。
% ^" T. O" G3 l
) T2 w) Y+ s; {% f' z11.MySQL服务器权限控制MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE等权限(详见user超级用户表)。- M( e2 P# E9 z$ s& M5 Z. ]1 J
它的附加的功能包括有匿名的用户并对于MySQL特定的功能例如LOAD DATA INFILE进行授权及管理操作的能力。管理员可以对user,db,host等表进行配置,来控制用户的访问权限,而user表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。
) e: w; e+ Z9 Y7 s对其他用户,你应该把在user表中的权限设成’N’并且仅在特定数据库的基础上授权。9 r) |4 B) [/ a5 w8 B
你可以为特定的数据库、表或列授权,FILE权限给予你用LOAD DATA INFILE和SELECT …INTO OUTFILE语句读和写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器能读或写的任何文件。(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。6 K& F2 h: C0 H. A+ t( M; y0 t
FILE权限允许用户在MySQL服务器具有写权限的目录下创建新文件,+ l2 l3 k3 y# ]& d; x: |7 b/ z/ n
但不能覆盖已有文件在user表的File_priv设置Y或N。
' C4 v( k( ]: H% Q. h' N- }$ M+ J所以当你不需要对服务器文件读取时,请关闭该权限。* Z1 m  s( L' A. V& o
#mysql> load data infile ’sqlfile.txt’into table loadfile.users fields terminated by ‘,’; Query OK, 4 rows affected (0.00 sec) //5 w1 C4 r1 J: F9 O' f1 b% F3 _
读取本地信息sqlfile.txt’Records: 4 Deleted: 0 Skipped: 0 Warnings: 0 #mysql> update user set File_priv=’N’where user=’root’; //, e0 r/ b0 z, k
禁止读取权限Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> flush privileges; //
  g; [6 h2 Q, m+ f% J$ A2 Q2 X刷新授权表Query OK, 0 rows affected (0.00 sec) #mysql> load data infile ’sqlfile.txt’into table users fields terminated by ‘,’; //4 t9 O9 r' v8 y* e% w# k
重登陆读取文件#ERROR 1045 (28000): Access denied for user ‘root’@’localhost’(using password: YES) //
+ l" e% v* Y( k- a失败# mysql> select * from loadfile.users into outfile ‘test.txt’fields terminated by ‘,’; ERROR 1045 (28000): Access denied for user ‘root’@’localhost’(using password: YES)3 D: c/ U0 _7 ?9 ]; Y+ ~5 R

6 H3 `+ [/ z7 ], A1 j: W为了安全起见,随时使用SHOW GRANTS语句检查查看谁已经访问了什么。然后使用REVOKE语句删除不再需要的权限。
9 H3 z0 I0 [% [/ B% Z4 x' |- F
; ?$ P8 m7 m5 x5 R0 c/ X12.使用chroot方式来控制MySQL的运行目录Chroot是linux中的一种系统高级保护手段,它的建立会将其与主系统几乎完全隔离,也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时候。
: R# A' Z8 }: l  L
* o& E, P7 Y9 Y$ u* [13.关闭对无关的Web程序访问的支持如果不打算让Web访问使用MySQL数据库,没有提供诸如PHP这样的Web语言的时候,重新设置或编译你的PHP,取消它们对MySQL的默认支持。假如服务器中使用php等web程序,试试用Web形式非法的请求,如果得到任何形式的MySQL错误,立即分析原因,7 O& R5 {0 N0 ]7 u* M' Q$ Y  D9 a) r8 V9 W
及时修改Web程序,堵住漏洞,防止MySQL暴露在web面前。. ^/ |( z' Q  j! l& i4 q
对于Web的安全检查,在MySQL官方文档中这么建议,对于web应用,至少检查以下清单:试试用Web形式输入单引号和双引号(‘’’和‘”’)。如果得到任何形式的MySQL错误,立即分析原因。试试修改动态URL,可以在其中添加"(‘”’)、#(‘#’)和'(‘’’)。4 y+ ?6 p. N# {+ k6 J4 o# r/ A  U" W! a
试试在动态URL中修改数据类型,使用前面示例中的字符,包括数字和字符类型。
  _+ J7 |/ e. t+ ]$ |你的应用程序应足够安全,可以防范此类修改和类似攻击。 试试输入字符、空格和特殊符号,不要输入数值字段的数字。
3 l9 V) I/ N2 y& l: k( R# f你的应用程序应在将它们传递到MySQL之前将它们删除或生成错误。将未经过检查的值传递给MySQL是很危险的!
% Z$ x" ?7 M6 C# B2 S$ e5 k将数据传给MySQL之前先检查其大小。用管理账户之外的用户名将应用程序连接到数据库。不要给应用程序任何不需要的访问权限。
6 c2 m2 t- o: t/ ^6 ]2 f- O
% R' [# M  L! t, S  {: R& O5 q4 S14.数据库备份策略 使用mysqldump进行备份非常简单,如果要备份数据库”nagios_db_backup ”,) Z7 P/ ~4 c+ W
4 U/ a  u) @2 y6 w& L9 v2 d5 R, v0 l
使用命令,同时使用管道gzip命令对备份文件进行压缩,建议使用异地备份的形式,可以采用Rsync等方式,( U9 x! C+ n, ^

6 I+ B6 O6 {& `1 @3 W将备份服务器的目录挂载到数据库服务器,将数据库文件备份打包在,通过crontab定时备份数据:' ]) ^2 y' a% V9 B6 C) c5 _
1 M4 ^4 T( K% V" y5 ~( w
#!/bin/sh time=`date +”(“%F”)”%R` $/usr/local/mysql/bin/mysqldump -u nagios -pnagios nagios
" Z! t! i# K. A* S) o| gzip >/home/sszheng/nfs58/nagiosbackup/nagios_backup.$time.gz # crontab -l # m h dom mon dow command 00 00 * * * /home/sszheng/shnagios/backup.sh6 ?: T: U& P' N0 O% W/ U
恢复数据使用命令:gzip -d nagios_backup.(2008-01-24)00:00.gz nagios_backup.(2008-01-24)00:00 #mysql ?u root -p nagios
; R- w) G9 ~1 V4 _# }  U< /home/sszheng/nfs58/nagiosbackup/nagios_backup.(2008-01-24)12:00
9 t' ^+ u8 V2 p# c  l4 [! G- X# k# E( H4 o5 Z5 O0 s
15. Mysqld安全相关启动选项?local-infile[={0|1}] 如果用?local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句。
. D3 u8 X7 r7 }+ K  Y/ n9 K' _?old-passwords 强制服务器为新密码生成短(pre-4.1)密码哈希。5 j  ]  \: Z  n( b6 P+ g
当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。(OBSOLETE) ?safe-show-database 在以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名。
) P+ C$ U8 j% g0 K' u" r在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。2 n; Z0 \- c; _$ m! b
?safe-user-create 如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。
7 q; m( Q  l' v1 d/ H如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:9 P- p! o0 g4 r$ @% S- j$ T' l
mysql> GRANT INSERT(user) ON mysql.user TO ‘user_name’@’host_name’;$ [1 p# _: D( z) \
这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。?secure-auth( G9 P! z& |$ W2 M0 @7 u1 v5 c( H0 R* b
不允许鉴定有旧(pre-4.1)密码的账户。
5 a2 P. I( r: j; s5 {
8 `/ `+ F' `7 P+ I3 A( q16.information_schema 安全在用户角度来看,INFORMATION_SCHEMA只是一个以插件方式存在的存储引擎,3 j/ [- `2 _( u: b
编译安装的时候?disable-information-schema 就行了added TRIGGER_ACL check for I_S.TRIGGERS http://bugs.mysql.com/bug.php?id=388372 B) J+ r8 {8 E5 \0 @: Q, h" w) N
http://bugs.mysql.com/bug.php?id=27629
$ \) w& K! h' G9 @% n9 I1 BPhpmyadmin里隐藏方法$cfg['servers'][$i]['hide_db'] = ‘information_schema’;
# y7 X* Y' G+ B2 N3 U- _
5 O$ W, `/ b4 N( H2 s; e再用vsftpd结合pam_mysql基本上一个web服务器大致就完工了Iptables方面:) {# ~8 t- w4 Y) p$ V
% U7 }: p: `. C% f+ ]! @
iptables -F iptables -X iptables -Z iptables -A INPUT -i lo -j ACCEPT( p1 W% O* T2 U* ]
iptables -P INTPUT DROP iptables -A INPUT -p tcp ?dport 21 -j ACCEPT
# @4 [+ K6 a: f: _6 Niptables -A INPUT -p tcp ?dport 22 -j ACCEPT iptables -A INPUT -p tcp ?dport 80 -j ACCEPT
- l6 V8 W, D. K; R1 B# x$ S" Ziptables -A INPUT -p tcp -dport 80 -m recent -name BAD_HTTP_ACCESS -update -seconds 60" X# c) o) E$ X" i) p' |" I6 ?7 ?
-hitcount 30 -j REJECT iptables -A INPUT -p tcp -dport 80 -m recent -name
+ W/ h8 Z3 Q( ]BAD_HTTP_ACCESS -set -j ACCEPT iptables -P OUTPUT DROP iptables -A OUTPUT -p tcp
. J8 K, [  y5 i6 \( o" r?sport 80 -j ACCEPT iptables -A OUTPUT -p tcp ?sport 21 -j ACCEPT iptables
" J% r  c$ \/ k( A$ j4 G7 x% d8 c* s0 q-A OUTPUT -p tcp ?sport 22 -j ACCEPT iptables -A INPUT -m state ?
& X$ t8 _9 U% v% j6 w6 Q9 Dstate RELATED,ESTABLISHED -j ACCEPT
0 w  X5 s; E& o) ~$ P7 Viptables -A OUTPUT -p tcp -dport 80 -m recent -name BAD_HTTP_ACCESS -update
& c7 |$ ~8 t$ V6 Y-seconds 60 -hitcount 30 -j REJECT
0 Q) M0 r6 k: m6 G+ Piptables -A INPUT -p tcp -dport 80 -m recent -name BAD_HTTP_ACCESS -set -j ACCEPT) W* B- |0 x; J8 `
iptables -A OUTPUT -m state ?state RELATED,ESTABLISHED -j ACCEPT$ c6 \& U5 H& t' B; x
4 c! a' S" `9 M5 j( A! m* Y
如果还不放心的话,最后用各类安全扫描工具扫描下服务器是否存在其他漏洞。2 B0 U, j! z6 N* X9 A! D& w$ T7 \

+ @; b% Z. W, y如果系统是windows系列的,一般修改相关路径即可~
CCNA考试 官方正规报名 仅需1500元
回复 论坛版权

使用道具 举报

dadahaoren [VIP@钻石] 发表于 2013-10-15 09:52:53 | 显示全部楼层
鼎力支持!!
回复 支持 反对

使用道具 举报

skyii [Lv8 技术精悍] 发表于 2013-10-15 20:13:45 | 显示全部楼层
好好 学习了 确实不错
回复 支持 反对

使用道具 举报

dfgh [Lv8 技术精悍] 发表于 2013-10-15 20:13:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

pkaa123 [Lv8 技术精悍] 发表于 2013-10-18 21:36:41 | 显示全部楼层
路过,支持一下啦
回复 支持 反对

使用道具 举报

海皇CHICBOY [Lv8 技术精悍] 发表于 2013-10-18 23:56:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

vexz [Lv8 技术精悍] 发表于 2013-10-19 15:52:18 | 显示全部楼层
这是什么东东啊
回复 支持 反对

使用道具 举报

mjf1125 [Lv8 技术精悍] 发表于 2013-10-21 19:10:30 | 显示全部楼层
学习了,不错,讲的太有道理了
回复 支持 反对

使用道具 举报

wwwsinakok [Lv8 技术精悍] 发表于 2013-10-22 15:05:46 | 显示全部楼层
回复 支持 反对

使用道具 举报

牙斬斬 [Lv8 技术精悍] 发表于 2013-10-22 16:38:39 | 显示全部楼层
学习了,不错,讲的太有道理了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图浏览|手机版|网站地图|攻城狮论坛

GMT+8, 2026-7-5 14:51 , Processed in 0.138806 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

Designed by ARTERY.cn