Tomcat容器管理之安全防护
2012-06-25 14:45
585 查看
当我们对Web应用程序中受保护的资源进行控制时,可以通过两种方式来实现:第一种方式就是通过应用程序管理的安全防护,如编写安全验证代码;第二种方式就是通过Tomcat容器管理的安全防护。下面我们将对第二种方式进行简单的介绍。
领域
要使用Tomcat的容器管理的安全防护机制,就须要设定领域(Realm)。领域是用户、密码及角色的集合。Web应用程序可以在/WEB-INF/web.xml 中进行设置,设定哪些用户组可以访问哪些资源,Tomcat管理员可以使用一个或多个领域来获取用户、密码及角色信息。Tomcat含有4种领域实现:UserDatabaseRealm,JDBCRealm,JNDIRealm,JAARealm。Java开发者可以创建额外的领域实现,以便作为与其用户和密码的接口。如欲指定应该使用何种领域,请在$CATALINA_HOME/conf/server.xml中插入Realm元素(或者在/META-INF/context.xml),其中className属性设定你想使用的领域,然后通过该实现的自定义属性以提供此领域相关的配置信息:
注意:Tomcat的Realm API无法用来添加或移除用户,这不是Realm接口的一部分。因此需要自己想办法来添加或从领域中移除用户,除非您决定使用的领域刚好实现了这些功能。
UserDatabaseRealm(tomcat默认领域)
它是从静态文件加载到内存中的,直到Tomcat停止后才从内存中清除。也就是说,权限文件只会在启动时读取一次。在UserDatabaseRealm中分配权限的默认文件为$CATALINA_HOME/conf目录中的tomcat-users.xml。如果更改了其中的配置,需要重启Tomcat。tomcat-users.xml是此领域的关键,根元素是tomcat-users,而且只能使用role及user元素。每个role元素只有一个属性:rolename。每个user元素有3个属性:username,password及roles,如图所示。
UserDatabaseRealm
这是使用关系数据库的领域。用户、密码及角色都保存在数据库中,而JDBCRealm会马上访问他们。例如,假设现成的管理软件在关系数据库的数据表中新增一个账号,JDBCRealm就会立刻访问它。
JNDIRealm
如果需要让Tomcat从LDAP目录中取得用户名、密码及角色,则可以使用此领域。JNDIRealm是非常有弹性的Realm实现,可以依据用户名、密码及角色的LDAP目录来验证用的省份,同时还允许该数据库用于许多不同的模式布局。JNDIRealm可以递归地搜寻LDAP的层次目录,直到找到所需的信息为止,或者可以设定在目录服务器的特定位置中寻找。
JAASRealm
JAASRealm是经由JAAS(Java Authentication and Authorization Service,Java验证与授权服务)验证用户的一种领域实现。JAAS实现了标准的“可插入式验证模块”(PAM)架构,此架构可让应用程序独立于验证实现之外。可以不经修改应用在程序本身而只需稍微修改应用程序的配置设定,在应用程序中插入全新或更新的验证实现。
容器管理的安全防护
当我们访问受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,而每种类型都以不同的方式取得身份:
基本验证 通过HTTP验证,需要提供base64编码文本的用户口令。
摘要验证 通过HTTP验证,需要提供摘要编码字符串的用户口令。
表单验证 在网页的表单上要求提供用户密码。
Client-cert验证 以客户端数字证书来确认用户的身份。
前三种验证方式类似而且比较简单,第4种验证方式可以参考相关书籍,我们以表单验证来说明前3种的使用方法,另外领域采用JDBCRealm。
在/META-INF下新建context.xml,代码如下:
数据库代码(参考tomcat-doc中代码)
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
在/WEB-INF/web.xml 中设置受保护的资源。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
login.jsp代码(省略了部分代码,注意其中form的action属性以及input的name属性都是固定格式)
上面省略了一些文件,比如error.jsp,index.jsp等。当Tomcat容器发现未登陆用户访问受保护(/admin/*下)的资源时,就会将form-login-page下的/login.jsp显示给用户。用户输入登陆信息后,Tomcat就会通过JDBCRealm访问数据库的用户、密码及角色信息。如果验证成功则转到受保护的资源;如果用户登陆尝试失败,则form-error-page表示的error.jsp就会显示给用户。
领域
要使用Tomcat的容器管理的安全防护机制,就须要设定领域(Realm)。领域是用户、密码及角色的集合。Web应用程序可以在/WEB-INF/web.xml 中进行设置,设定哪些用户组可以访问哪些资源,Tomcat管理员可以使用一个或多个领域来获取用户、密码及角色信息。Tomcat含有4种领域实现:UserDatabaseRealm,JDBCRealm,JNDIRealm,JAARealm。Java开发者可以创建额外的领域实现,以便作为与其用户和密码的接口。如欲指定应该使用何种领域,请在$CATALINA_HOME/conf/server.xml中插入Realm元素(或者在/META-INF/context.xml),其中className属性设定你想使用的领域,然后通过该实现的自定义属性以提供此领域相关的配置信息:
<Realm className="... class name for this implementation" ... other attributes for this implementation .../>
注意:Tomcat的Realm API无法用来添加或移除用户,这不是Realm接口的一部分。因此需要自己想办法来添加或从领域中移除用户,除非您决定使用的领域刚好实现了这些功能。
UserDatabaseRealm(tomcat默认领域)
它是从静态文件加载到内存中的,直到Tomcat停止后才从内存中清除。也就是说,权限文件只会在启动时读取一次。在UserDatabaseRealm中分配权限的默认文件为$CATALINA_HOME/conf目录中的tomcat-users.xml。如果更改了其中的配置,需要重启Tomcat。tomcat-users.xml是此领域的关键,根元素是tomcat-users,而且只能使用role及user元素。每个role元素只有一个属性:rolename。每个user元素有3个属性:username,password及roles,如图所示。
<tomcat-users> <user name="tomcat" password="tomcat" roles="tomcat" /> <user name="role1" password="tomcat" roles="role1" /> <user name="both" password="tomcat" roles="tomcat,role1" /> </tomcat-users>
UserDatabaseRealm
这是使用关系数据库的领域。用户、密码及角色都保存在数据库中,而JDBCRealm会马上访问他们。例如,假设现成的管理软件在关系数据库的数据表中新增一个账号,JDBCRealm就会立刻访问它。
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/authority?user=root&password=root" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/>
JNDIRealm
如果需要让Tomcat从LDAP目录中取得用户名、密码及角色,则可以使用此领域。JNDIRealm是非常有弹性的Realm实现,可以依据用户名、密码及角色的LDAP目录来验证用的省份,同时还允许该数据库用于许多不同的模式布局。JNDIRealm可以递归地搜寻LDAP的层次目录,直到找到所需的信息为止,或者可以设定在目录服务器的特定位置中寻找。
JAASRealm
JAASRealm是经由JAAS(Java Authentication and Authorization Service,Java验证与授权服务)验证用户的一种领域实现。JAAS实现了标准的“可插入式验证模块”(PAM)架构,此架构可让应用程序独立于验证实现之外。可以不经修改应用在程序本身而只需稍微修改应用程序的配置设定,在应用程序中插入全新或更新的验证实现。
容器管理的安全防护
当我们访问受保护的资源时,容器管理的验证方法可以控制确认用户身份的方式。Tomcat支持四种容器管理的安全防护,而每种类型都以不同的方式取得身份:
基本验证 通过HTTP验证,需要提供base64编码文本的用户口令。
摘要验证 通过HTTP验证,需要提供摘要编码字符串的用户口令。
表单验证 在网页的表单上要求提供用户密码。
Client-cert验证 以客户端数字证书来确认用户的身份。
前三种验证方式类似而且比较简单,第4种验证方式可以参考相关书籍,我们以表单验证来说明前3种的使用方法,另外领域采用JDBCRealm。
在/META-INF下新建context.xml,代码如下:
<?xml version="1.0" encoding="UTF-8"?> <Context> <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/authority?user=root&password=root" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name"/> </Context>
数据库代码(参考tomcat-doc中代码)
create table users ( user_name varchar(15) not null primary key, user_pass varchar(15) not null ); create table user_roles ( user_name varchar(15) not null, role_name varchar(15) not null, primary key (user_name, role_name) );
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
在/WEB-INF/web.xml 中设置受保护的资源。
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
<security-constraint> <web-resource-collection> <web-resource-name>test</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method><!--此处设置表单验证--> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/error.jsp</form-error-page> </form-login-config> </login-config> <security-role> <role-name>admin</role-name> </security-role>
login.jsp代码(省略了部分代码,注意其中form的action属性以及input的name属性都是固定格式)
<html> <head> </head> <body> <form action="j_security_check" method="post"> <p><strong>Please Enter Your User Name: </strong> <input type="text" name="j_username" size="25"> <p><p><strong>Please Enter Your Password: </strong> <input type="password" size="15" name="j_password"> <p><p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> </body> </html>
上面省略了一些文件,比如error.jsp,index.jsp等。当Tomcat容器发现未登陆用户访问受保护(/admin/*下)的资源时,就会将form-login-page下的/login.jsp显示给用户。用户输入登陆信息后,Tomcat就会通过JDBCRealm访问数据库的用户、密码及角色信息。如果验证成功则转到受保护的资源;如果用户登陆尝试失败,则form-error-page表示的error.jsp就会显示给用户。
相关文章推荐
- Tomcat容器管理安全的几种验证方式
- Tomcat容器管理安全的几种验证方式
- Tomcat容器管理安全的验证方式汇总
- Tomcat容器管理安全的几种验证方式
- Tomcat容器管理安全的几种验证方式
- Tomcat容器管理安全的几种验证方式
- Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式
- Tomcat容器管理安全的几种验证方式
- Tomcat学习总结(5)——Tomcat容器管理安全的几种验证方式
- Tomcat容器管理安全的几种验证方式
- 如何利用IP安全管理策略进行安全漏洞防护
- tomcat安全防护之普通用户运行
- 系统管理:充分利用Linux的安全防护工具
- 基于容器的用户安全管理系统和JMS(3)
- 实验三十五 Windows Server 2012 RDS桌面虚拟化之六VDI虚拟桌面的用户管理和安全防护
- 基于容器的用户安全管理系统和JMS(7)
- 基于容器的用户安全管理系统和JMS(2)
- 从Discuz论坛管理看网站安全防护
- tomcat WEB容器安全设置
- Tomcat 6 --- 你很少使用的安全管理SecurityManager