Kerberos
Kerberos 是一个用于服务请求时在服务端和客户端进行身份认证的服务,Kerberos支持在所有操作系统上进行构建,包括有 Windows、macOS、FrssBSD 和 Linux。
官方网址:https://www.kerberos.org/
1.Kerberos 环境
Kerberos 环境下访问远程主机的服务,需要在主机上先进行认证,然后才可以携带 kerbeors 主机和 keytab 文件访问。
1.1 Kerbero 主机认证
# keytab_file:keytab文件路径
# kerberos_principal:kerbeors的principal
kinit -kt <keytab_file> <kerberos_principal>
1.2 Kerberos环境下的curl
# method:请求方法,例如GET、POST、PUT...
# negotiate:指定kerberos环境,会携带当前主机认证的kerberos principal进行访问
# username:用户名
# password:密码
# url:要请求的服务地址
curl -X <method> --negotiate -u <username>:<password> -i url
2.Python
2.1 第三方包安装
pip install requests
pip install requests_kerberos
pip install krbcontext
2.2 工具类
这里以 Python
调用 Hadoop
的 Rest
接口为例,测试 Python
在 Kerberos
环境下的服务调用。
Hadoop Rest
接口文档地址:https://hadoop.apache.org/docs/r1.0.4/webhdfs.html
# -*- coding=utf-8 -*-
import json
import logging
import requests
import posixpath
from requests.auth import HTTPBasicAuth
from requests_kerberos import HTTPKerberosAuth
from krbcontext import krbContext
_NAMENODE_STATUS_URL = 'jmx'
_HDFS_REST_URL = 'webhdfs/v1'
_ACCEPT_CONTENT_TYPE = 'application/json'
LOG = logging.getLogger(__name__)
class HdfsRestApi(object):
"""
HDFS Rest 接口工具类
"""
def __init__(self, url, username, password, security_enabled=False, principal=None, keytab_file=None):
self._url = posixpath.join(url)
self._username = username
self._password = password
self._security_enabled = security_enabled
self._auth = HTTPBasicAuth(self._username, self._password)
if self._security_enabled:
with krbContext(using_keytab=True, principal=principal, keytab_file=keytab_file):
self._auth = HTTPKerberosAuth()
def __str__(self):
return "HDFS Rest Url Address Is {HDFS_REST_URL}".format(HDFS_REST_URL=self._url)
def _get_params(self, params=None):
params = params if params is not None else {}
return params
def get_namenode_status(self):
"""
获取NameNode的状态信息
@return:
"""
result = {'code': 200, 'message': 'success'}
url = posixpath.join(self._url, _NAMENODE_STATUS_URL)
params = self._get_params({"qry": "Hadoop:service=NameNode,name=NameNodeStatus"})
try:
response = requests.get(url, params=params, headers={'Accept': _ACCEPT_CONTENT_TYPE}, auth=self._auth)
if response.status_code == 200:
result['data'] = json.loads(response.text)
else:
result['code'] = response.status_code
result['message'] = response.text
except requests.exceptions.RequestException as e:
result['code'] = 500
result['message'] = "请求出现异常:{error_message}".format(error_message=e)
return result
def get_path_quota(self, path):
"""
获取路径的配额信息(空间配额)
@return:
"""
result = {
'code': 200,
'message': 'success'
}
path = path[1:] if path.startswith('/') else path
url = posixpath.join(self._url, _HDFS_REST_URL, path)
params = self._get_params({"op": "GETQUOTAUSAGE"})
try:
response = requests.get(url, params=params, headers={'Accept': _ACCEPT_CONTENT_TYPE}, auth=self._auth)
if response.status_code == 200:
result['data'] = json.loads(response.text)
else:
result['code&