<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<!--#include virtual="includes/_header.htm" -->
<body class="page-project-security ">
<!--#include virtual="includes/_top.htm" -->
<div class="content">
	<!--#include virtual="includes/_nav.htm" -->
	<div class="right">
		<h1 class="content-title">Kafka security</h1>
		<p>
			The Apache Software Foundation takes security issues very seriously. Apache Kafka&reg; specifically offers security features and is responsive to issues around its features. If you have any concern around Kafka Security or believe you have uncovered a vulnerability, we suggest that you get in touch via the e-mail address <a href="mailto:security@kafka.apache.org?Subject=[SECURITY] My security issue" target="_top">security@kafka.apache.org</a>. In the message, try to provide a description of the issue and ideally a way of reproducing it. The security team will get back to you after assessing the description.
		</p>
		<p>
			Note that this security address should be used only for undisclosed vulnerabilities. Dealing with fixed issues or general questions on how to use the security features should be handled regularly via the user and the dev lists. <b>Please report any security problems to the project security address before disclosing it publicly.</b>
		</p>
		<p>
			The <span class="caps">ASF</span> Security team maintains a page with a description of how vulnerabilities are handled, check their <a href="http://www.apache.org/security/">Web page</a> for more information.
		</p>

		<p>
                        For a list of security issues fixed in released versions of Apache Kafka, see <a href="/cve-list">CVE list</a>.
		</p>

<!--#include virtual="includes/_footer.htm" -->

<script>
// Show selected style on nav item
$(function() { $('.b-nav__security').addClass('selected'); });
</script>
