安全
默认情况下,所有门都打开。 限制对Web应用程序的访问的一种简单方法是在网络级别或使用SSH隧道执行此操作。
但是,可以通过使用其中一个提供的后端或创建自己的后端来打开身份验证。
请务必查看Experimental Rest API以保护API。
Web身份验证
密码
最简单的身份验证机制之一是要求用户在登录前指定密码。密码身份验证需要在需求文件中使用password
子包。 密码哈希在存储密码之前使用bcrypt。
[ webserver ]
authenticate = True
auth_backend = airflow.contrib.auth.backends.password_auth
启用密码身份验证后,需要先创建初始用户凭据,然后才能登录任何人。 未在此身份验证后端的迁移中创建初始用户,以防止默认Airflow安装受到攻击。 必须通过安装Airflow的同一台机器上的Python REPL创建新用户。
# navigate to the airflow installation directory
$ cd ~/airflow
$ python
Python 2 .7.9 ( default, Feb 10 2015 , 03 :28:08 )
Type "help" , "copyright" , "credits" or "license" for more information.
>>> import airflow
>>> from airflow import models, settings
>>> from airflow.contrib.auth.backends.password_auth import PasswordUser
>>> user = PasswordUser ( models.User ())
>>> user.username = 'new_user_name'
>>> user.email = 'new_user_email@example.com'
>>> user.password = 'set_the_password'
>>> session = settings.Session ()
>>> session.add ( user )
>>> session.commit ()
>>> session.close ()
>>> exit ()
LDAP
要打开LDAP身份验证,请按如下方式配置airflow.cfg
。 请注意,该示例使用与ldap服务器的加密连接,因为您可能不希望密码在网络级别上可读。 但是,如果您真的想要,可以在不加密的情况下进行配置。
此外,如果您使用的是Active Directory,并且没有明确指定用户所在的OU,则需要将search_scope
更改为“SUBTREE”。
有效的search_scope选项可以在ldap3文档中找到
[ webserver ]
authenticate = True
auth_backend = airflow.contrib.auth.backends.ldap_auth
[ ldap ]
# set a connection without encryption: uri = ldap://<your.ldap.server>:<port>
uri = ldaps://<your.ldap.server>:<port>
user_filter = objectClass = *
# in case of Active Directory you would use: user_name_attr = sAMAccountName
user_name_attr = uid
# group_member_attr should be set accordingly with *_filter
# eg :
# group_member_attr = groupMembership
# superuser_filter = groupMembership=CN=airflow-super-users...
group_member_attr = memberOf
superuser_filter = memberOf = CN = airflow-super-users,OU = Groups,OU = RWC,OU = US,OU = NORAM,DC = example,DC = com
data_profiler_filter = memberOf = CN = airflow-data-profilers,OU = Groups,OU = RWC,OU = US,OU = NORAM,DC = example,DC = com
bind_user = cn = Manager,dc = example,dc = com
bind_password = insecure
basedn = dc = example,dc = com
cacert = /etc/ca/ldap_ca.crt
# Set search_scope to one of them: BASE, LEVEL , SUBTREE
# Set search_scope to SUBTREE if using Active Directory, and not specifying an Organizational Unit
search_scope = LEVEL
superuser_filter和data_profiler_filter是可选的。 如果已定义,则这些配置允许您指定用户必须属于的LDAP组,以便拥有超级用户(admin)和数据分析器权限。 如果未定义,则所有用户都将成为超级用户和数据分析器。
滚动你自己
Airflow使用flask_login
并在airflow.default_login
模块中公开一组挂钩。 您可以更改内容并使其成为PYTHONPATH
一部分,并将其配置为airflow.cfg
的后端。
[ webserver ]
authenticate = True
auth_backend = mypackage.auth
多租户
通过在配置中设置webserver:filter_by_owner
,可以在启用身份验证时按所有者名称筛选webserver:filter_by_owner
。 有了这个,用户将只看到它所有者的dags,除非它是超级用户。
[ webserver ]
filter_by_owner = True
Kerberos的
Airflow最初支持Kerberos。 这意味着气流可以为自己更新kerberos票证并将其存储在票证缓存中。 钩子和匕首可以使用票证来验证kerberized服务。
限制
请注意,此时并未调整所有挂钩以使用此功能。 此外,它没有将kerberos集成到Web界面中,您现在必须依赖网络级安全性来确保您的服务保持安全。
Celery集成尚未经过试用和测试。 但是,如果您为每个主机生成一个密钥选项卡,并在每个工作人员旁边启动一个故障单续订器,那么它很可能会起作用。
启用kerberos
空气流动
要启用kerberos,您需要生成(服务)密钥选项卡。
# in the kadmin.local or kadmin shell, create the airflow principal
kadmin: addprinc -randkey airflow/fully.qualified.domain.name@YOUR-REALM.COM
# Create the airflow keytab file that will contain the airflow principal
kadmin: xst -norandkey -k airflow.keytab airflow/fully.qualified.domain.name
现在将此文件存储在气流用户可以读取的位置(chmod 600)。 然后将以下内容添加到airflow.cfg
[ core ]
security = kerberos
[ kerberos ]
keytab = /etc/airflow/airflow.keytab
reinit_frequency = 3600
principal = airflow
启动票证续订
# run ticket renewer
airflow kerberos
Hadoop的
如果要使用模拟,则需要在hadoop配置的core-site.xml
中启用。
<property>
<name>hadoop.proxyuser.airflow.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.airflow.users</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.airflow.hosts</name>
<value>*</value>
</property>
当然,如果您需要加强安全性,请用更合适的东西替换星号。
使用kerberos身份验证
已更新配置单元挂钩以利用kerberos身份验证。 要允许DAG使用它,只需更新连接详细信息,例如:
{ "use_beeline" : true, "principal" : "hive/_HOST@EXAMPLE.COM" }
根据您的设置调整主体。 _HOST部分将替换为服务器的完全限定域名。
您可以指定是否要将dag所有者用作连接的用户或连接的登录部分中指定的用户。 对于登录用户,请将以下内容指定为额外:
{ "use_beeline" : true, "principal" : "hive/_HOST@EXAMPLE.COM" , "proxy_user" : "login" }
对于DAG所有者使用:
{ "use_beeline" : true, "principal" : "hive/_HOST@EXAMPLE.COM" , "proxy_user" : "owner" }
在DAG中,初始化HiveOperator时,请指定:
run_as_owner = True
OAuth身份验证
GitHub Enterprise(GHE)身份验证
GitHub Enterprise身份验证后端可用于对使用OAuth2安装GitHub Enterprise的用户进行身份验证。 您可以选择指定团队白名单(由slug cased团队名称组成)以限制仅登录这些团队的成员。
[ webserver ]
authenticate = True
auth_backend = airflow.contrib.auth.backends.github_enterprise_auth
[ github_enterprise ]
host = github.example.com
client_id = oauth_key_from_github_enterprise
client_secret = oauth_secret_from_github_enterprise
oauth_callback_route = /example/ghe_oauth/callback
allowed_teams = 1 , 345 , 23
注意
如果您未指定团队白名单,那么在GHE安装中拥有有效帐户的任何人都可以登录Airflow。
设置GHE身份验证
必须先在GHE中设置应用程序,然后才能使用GHE身份验证后端。 要设置应用程序:
- 导航到您的GHE配置文件
- 从左侧导航栏中选择“应用程序”
- 选择“开发者应用程序”选项卡
- 点击“注册新申请”
- 填写所需信息(“授权回调URL”必须完全合格,例如http://airflow.example.com/example/ghe_oauth/callback )
- 点击“注册申请”
- 根据上面的示例,将“客户端ID”,“客户端密钥”和回调路由复制到airflow.cfg
在github.com上使用GHE身份验证
可以在github.com上使用GHE身份验证:
- 创建一个Oauth应用程序
- 根据上面的示例,将“客户端ID”,“客户端密钥”复制到airflow.cfg
- 在
host = github.com
设置host = github.com
和oauth_callback_route = /oauth/callback
Google身份验证
Google身份验证后端可用于使用OAuth2对Google用户进行身份验证。 您必须指定电子邮件域以限制登录(以逗号分隔),仅限于这些域的成员。
[ webserver ]
authenticate = True
auth_backend = airflow.contrib.auth.backends.google_auth
[ google ]
client_id = google_client_id
client_secret = google_client_secret
oauth_callback_route = /oauth2callback
domain = "example1.com,example2.com"
设置Google身份验证
必须先在Google API控制台中设置应用程序,然后才能使用Google身份验证后端。 要设置应用程序:
- 导航到https://console.developers.google.com/apis/
- 从左侧导航栏中选择“凭据”
- 点击“创建凭据”,然后选择“OAuth客户端ID”
- 选择“Web应用程序”
- 填写所需信息(’授权重定向URI’必须完全合格,例如http://airflow.example.com/oauth2callback )
- 点击“创建”
- 根据上面的示例,将“客户端ID”,“客户端密钥”和重定向URI复制到airflow.cfg
SSL
可以通过提供证书和密钥来启用SSL。 启用后,请务必在浏览器中使用“ https:// ”。
[ webserver ]
web_server_ssl_cert = <path to cert>
web_server_ssl_key = <path to key>
启用SSL不会自动更改Web服务器端口。 如果要使用标准端口443,则还需要配置它。 请注意,侦听端口443需要超级用户权限(或Linux上的cap_net_bind_service)。
# Optionally, set the server to listen on the standard SSL port.
web_server_port = 443
base_url = http://<hostname or IP>:443
使用SSL启用CeleryExecutor。 确保正确生成客户端和服务器证书和密钥。
[ celery ]
CELERY_SSL_ACTIVE = True
CELERY_SSL_KEY = <path to key>
CELERY_SSL_CERT = <path to cert>
CELERY_SSL_CACERT = <path to cacert>
模拟
Airflow能够在运行任务实例时模拟unix用户,该任务实例基于任务的run_as_user
参数,该参数采用用户的名称。
注意:要模拟工作,必须使用<cite>sudo</cite>运行Airflow,因为使用<cite>sudo -u</cite>运行子任务并更改文件的权限。 此外,unix用户需要存在于worker上。 这是一个简单的sudoers文件条目可能看起来像这样,假设气流作为<cite>气流</cite>用户运行。 请注意,这意味着必须以与root用户相同的方式信任和处理气流用户。
airflow ALL=(ALL) NOPASSWD: ALL
带模拟的子任务仍将记录到同一文件夹,但他们登录的文件将更改权限,只有unix用户才能写入。
默认模拟
要防止不使用模拟的任务以<cite>sudo</cite>权限运行,可以设置core:default_impersonation
config,如果未设置<cite>run_as_user,</cite>则设置默认用户模拟。
[ core ]
default_impersonation = airflow