tomcat 7 apps 目录访问权限 io 拒绝访问
?
??????????????????? 描述:测试如何进行控制Tomcat目录访问权限
方法二可行
?
测试环境:安装java虚拟机,tomcat5.0,配置环境变量catalina.home=C:\Program Files\Apache Software Foundation\Tomcat 5.0java.home=C:\j2sdk1.4.2_08
?
文件目录结构:
虚拟目录指向test目录,目录aa位于test目录下
配置server.xml文件,添加两个虚拟目录,两个虚拟目录下内容相同,如下:<Context path="/test" docBase="C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\test" debug="5" reloadable="true"></Context><Context path="/tt" docBase="E:\tt" debug="5" reloadable="true"></Context>
?
测试文件:? testFilee.jsp可以在e盘根目录创建名为testtestFile222.txt的文件,需要“read”权限;? testFile.jsp可以在虚拟目录跟目录下创建名为testtestFile.txt的文件,需要“read”权限;? testBat.jsp调用批处理文件在E:\tt目录下创建名为new1的文件夹,批处理文件位于E:\tt目录下,需要“execute”权限
?
??? 可以直接编辑目录conf下的catalina.policy文件,对程序的访问权限进行控制,也可以使用C:\j2sdk1.4.2_08\bin下的policytool工具对该文件进行编辑,具体内容请看附件。
??? 测试的是 java.io.FilePermission, 控制对文件和目录的读/写/执行操作,有以下权限:read, write, delete和execute说明:directory/* :目录下的所有文件;
????*?: 当前目录的所有文件;
??? directory/- : 目录下的所有文件,包括子目录;
???- :当前目录下的所有文件,包括子目录;?? <<ALL FILES>>:文件系统中的所有文件
1.对testFile.jsp和testBat.jsp文件进行测试,在catalina.policy文件中添加以下语句:
?
1)grant codeBase "file:${catalina.home}/webapps/test/-" {?? permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\-", "write";?? permission java.io.FilePermission "<<ALL FILES>>", "execute";};运行结果:test/testFile.jsp可以执行;test/testBat.jsp可以执行test/aa/testFile.jsp可以执行;test/aa/testBat.jsp可以执行----------------------
2)grant codeBase "file:${catalina.home}/webapps/test/*" {?? permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\*", "write";?? permission java.io.FilePermission "<<ALL FILES>>", "execute";};运行结果:test/testFile.jsp可以执行;test/testBat.jsp不可执行,因为运行testBat.jsp文件需要调用子目录中的class文件test/aa/testFile.jsp可以执行;test/aa/testBat.jsp不可执行-----------------------
3)grant codeBase "file:${catalina.home}/webapps/test/aa/-" {?? permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\aa\\-", "write";?? permission java.io.FilePermission "<<ALL FILES>>", "execute";};运行结果:test/testFile.jsp不可执行;test/testBat.jsp不可执行;test/aa/testFile.jsp不可执行;test/aa/testBat.jsp不可执行;----------------------?
4)grant codeBase "file:${catalina.home}/webapps/test/aa/-" {?? permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\-", "write";?? permission java.io.FilePermission "<<ALL FILES>>", "execute";};运行结果:test/testFile.jsp不可执行;test/testBat.jsp不可执行;test/testFile.jsp不可执行;test/testBat.jsp不可执行;
----------------------?
5)grant codeBase "file:${catalina.home}/webapps/test/-" {?? permission java.security.AllPermission; };运行结果:test/testFile.jsp可以执行test/testBat.jsp可以执行test/aa/testFile.jsp可以执行test/aa/testBat.jsp可以执行----------------------
?6)grant codeBase "file:${catalina.home}/webapps/test/aa/-" {permission java.security.AllPermission; };运行结果:test/testFile.jsp不可执行test/testBat.jsp不可执行test/aa/testFile.jsp不可执行test/aa/testBat.jsp不可执行--------------------------------------------
?
?
2.对testFile.jsp和testFilee.jsp文件进行测试,在catalina.policy文件中添加以下语句:
?
1)grant codeBase "file:${catalina.home}/webapps/test/-" {?? permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\-", "write";?? permission java.io.FilePermission "E:\\-", "write";};运行结果:可以在e盘和test下创建出文件。--------------------2)grant codeBase "file:${catalina.home}/webapps/test/-" {// permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\-", "write";? permission java.io.FilePermission "E:\\-", "write";};运行结果:可以在e盘创建出文件,test下不可。
---------------------3)grant codeBase "file:${catalina.home}/webapps/test/-" {? permission java.io.FilePermission "C:\\Program Files\\Apache Software Foundation\\Tomcat 5.0\\webapps\\test\\-", "write";//permission java.io.FilePermission "E:\\-", "write";};运行结果:可以在test下创建出文件,e盘下不可。------------------------------------------
?
3.在catalina.policy文件中添加以下语句:
grant {permission java.security.AllPermission; };//所有虚拟目录下的应用程序代码都可以运行,相当于未做控制
运行结果:所有文件都可以正常运行。
?
?
测试结果:可以针对某个虚拟目录下的代码进行访问控制,控制对其它目录的“读、写、删除、执行”权限,但不能控制jsp文件的运行。
?
?
??? 编辑conf/web.conf 文件也可以做一些安全控制,如下:
?
?? 1)“listings”参数可以控制是否允许对目录进行列表;
?
?? 2)“readonly”参数可以控制页面的GET和POST权限,说明如下:
?? 正常情况下,web服务器的应用目录只有GET和POST权限,没有PUT和DELETE,可以在tomcat x.x/conf/web.xml内添加一个readonly属性值,这个属性缺省是true,就是只有GET和POST权限,这里需要修改为false。?? 在web.xml里找到以下代码?? ? <servlet> ????????<servlet-name>default</servlet-name> ????????<servlet-class> ??????????org.apache.catalina.servlets.DefaultServlet ????????</servlet-class> ????????<init-param> ????????????<param-name>debug</param-name> ????????????<param-value>0</param-value> ????????</init-param> ????????<init-param> ????????????<param-name>listings</param-name> ????????????<param-value>true</param-value> ????????</init-param> ????????<load-on-startup>1</load-on-startup>???</servlet> ? 1.将?????<init-param> ????????????<param-name>listings</param-name> ????????????<param-value>true</param-value> ????????</init-param> 中的 “true”改为“false”后,将不能对目录进行列表。
?
? 2.添加?? <init-param> ????????????<param-name>readonly</param-name> ????????????<param-value>false</param-value> ??????? </init-param>?
参数后,web应用程序将具有PUT和DELETE权限。
?
?
?
2.使用系统权限进行安全控制:
?
?? tomcat默认安装完成后其服务使用的是system帐户,具有很大的权限,所以应该使用另外一个权限较小的帐户。
?
1)新建帐户tom,不属于任何组
2)将tomcat服务启动账户更换为tom帐户
3)使用组策略编辑器,赋予tom账户加入“作为服务登陆”权限
4)赋予tom用户tomcat程序安装目录的完全控制权限
5)赋予tom用户网站程序目录的读权限,如需要写权限则进行相应的添加
6)删除其它驱动器的everyone权限,加入tom用户的拒绝权限
?
?
windows下apache与tomcat的整合
?
方法一:
?
1.软件安装版本:Apache 2.2.4, Tomcat 5.0.24, j2sdk-1_4_2_08-windows-i586-p.exe,mod_jk-1.2.30-httpd-2.2.3.so
注意JK的版本一定要与Apache版本相同,可以去官网下载,有多种版本,适用于各种操作系统,下载适用的既可,地址:http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/
2.软件安装:
1)安装JDK,JDK一定要在Tomcat之前安装
2)安装tomcat
3)安装apache,无需停止tomcat的服务。
??在IIS存在的时候,由于apache默认使用80端口,apache在安装完成后服务无法启动,需需要修改httpd.conf配置文件,更改端口,有两处需要更改。
4)JK的安装:把 mod_jk-1.2.26-httpd-2.2.4.so 拷贝到 C:\Program Files\Apache2.2\modules下即可.
测试:
访问 http://localhost/,显示 It works!,表示apache安装成功。
访问 http://localhost:8080,显示tomcat主页面,表示tomcat安装成功。
3.安装完毕后:
?
1)在tomcat目录下,进入conf目录,创建文件workers.properties,文件内容如下:
workers.tomcat_home=C:\Program Files\Apache Software Foundation\Tomcat 5.0 #让mod_jk模块知道Tomcat的位置workers.java_home=C:\Program Files\Java\j2re1.4.2_08 #让mod_jk模块知道jre的位置ps=\worker.list=ajp13 #模块版本worker.ajp13.port=8009 #工作端口,若没占用则不用修改worker.ajp13.host=localhost #本机,若上面的Apache主机不为localhost,作相应修改worker.ajp13.type=ajp13 #类型worker.ajp13.lbfactor=1 #代理数,不用修改
?
2)进入apache目录,在conf目录下找到httpd.conf文件,在文件末尾加入以下内容:
#设置Apache与Tomcat之间的连接,让Apache遇到jsp文件时,在后台将其交由Tomcat去处理LoadModule jk_module modules/mod_jk-1.2.30-httpd-2.2.3.so#此处mod_jk的文件为你下载的文件JkWorkersFile "C:\Program Files\Apache Software Foundation\Tomcat 5.0\conf\workers.properties"#指定tomcat监听配置文件地址JkLogFile "C:\Program Files\Apache Software Foundation\Apache2.2\logs\mod_jk2.log" #指定日志存放位置JkLogLevel info
ErrorLog logs/shsc-error_log.txtCustomLog logs/shsc-access_log.txt commonJkMount /servlet/* ajp13 #让Apache支持对servlet传送,用以Tomcat解析JkMount /*.jsp ajp13 #让Apache支持对jsp传送,用以Tomcat解析JkMount /*.do ajp13 #让Apache支持对.do传送,用以Tomcat解析
?
3)配置apache中conf下的httpd.conf文件,添加虚拟目录如下:Alias /test "C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\test"?? #虚拟目录名为test? <Directory "C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\test">? AllowOverride None??????? Order allow,deny??????? Allow from all???????<FilesMatch "\.(html)$">??????????????? Deny from all??????? </FilesMatch></Directory>?
Alias /tt "e:\tt" #虚拟目录名为tt<Directory "e:\tt">? AllowOverride None?????? Order allow,deny?????? Allow from all?????? <FilesMatch "\.(html|jsp|asp)$">?????????????? Deny from all?????? </FilesMatch></Directory>?
其虚拟目录与tomcat中虚拟目录配置要一致。
?
4)配置完成后进行测试:在地址栏中分别输入
http://localhost/test/index.jsp
http://localhost:8080/test/index.jsp
后,显示页面相同,表示tomcat和apache整合成功。
?
注意:
在此,apache只解析htm之类的静态页面,jsp页面都被转发到tomcat,由tomcat执行,apache只是起到一个转发的作用。
apache比tomcat执行静态页面的效率要高。
?
?
修改apahce下的配置文件httpd.conf中的
JkMount /*.jsp ajp13 改为? JkMount /tt/mm/*.jsp ajp13,则只能将mm目录下的jsp转发到tomcat。
测试结果:
访问 http://172.16.20.63/tt/index.jsp?无法解析
访问 http://172.16.20.63/tt/nn/index.jsp?无法解析访问 http://172.16.20.63/tt/mm/index.jsp?可以正常解析
?
测试结果说明:
控制apache转发的jsp文件目录,不转发的目录中的jsp则无法执行。
?
?
方法二:
?
1.软件安装方法同上,但不需要拷贝mod_jk-1.2.30-httpd-2.2.3.so 文件
?
2.软件安装完毕后,修改apache下的httpd.conf文件,将
?? LoadModule proxy_module modules/mod_proxy.so?? LoadModule proxy_ajp_module modules/mod_proxy_ajp.so前面的#号去掉
?
?在文件末尾添加如下语句:
? ProxyPass /tt/mm/ ! ? ProxyPass / ajp://127.0.0.1:8009/ ? ProxyPassReverse / ajp://127.0.0.1:8009/
?
测试结果:
访问 http://172.16.20.63/tt/index.jsp?可以正常解析
访问 http://172.16.20.63/tt/2.htm?可以正常解析
访问 http://172.16.20.63/tt/nn/index.jsp?可以正常解析
访问 http://172.16.20.63/tt/2.htm?可以正常解析访问 http://172.16.20.63/tt/mm/index.jsp?无法解析
访问 http://172.16.20.63/tt/2.htm?可以正常解析
?
测试结果说明:
控制apache转发的jsp文件目录,可以分别对需要转发或不转发的目录进行设置。
?
apache的访问控制权限:
1.??? Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。
?
所以,最常用的是:Order Deny,AllowAllow from All?
?
??? 注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。
?
按照上面的解释,下面的设定是无条件禁止访问:Order Allow,DenyDeny from All
?
如果要禁止部分内容的访问,其他的全部开放:Order Deny,AllowDeny from ip1 ip2或者Order Allow,DenyAllow from allDeny from ip1 ip2
?
apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:
?
Order Deny,AllowAllow from allDeny from domain.org错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。解决方法:Order Allow,Deny,后面两句不动,即可。
?
Order Allow,DenyAllow from ip1Deny from all错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。解决方法一:直接去掉第三句。解决方法二:Order Deny,AllowDeny from allAllow from ip1
.htaccess还未进行测试。
?
在使用Order allow,deny进行页面类型过滤的时候,可以控制对htm,html文件类型的访问控制,但是对jsp文件不能过滤,猜测可能是因为jsp文件被转发到tomcat去执行。
?
???????????
?