跳到主要内容

Akamai EdgeGrid 认证介绍

Akamai EdgeGrid 是Akamai内容分发网络(CDN)和边缘计算平台的API认证方案,它为API请求提供了一种安全的身份验证机制,保障只有授权用户能够访问和管理Akamai资源。EdgeGrid认证机制基于HTTP签名,使用加密算法确保请求的完整性和真实性。

Akamai EdgeGrid 的工作原理

EdgeGrid认证基于请求签名机制,该机制涉及以下步骤:

  1. 创建请求:构建标准的HTTP请求,包括方法、URL、查询参数和请求体。
  2. 准备要签名的内容:从请求中提取需要签名的数据,包括请求方法、路径、请求体的部分哈希等。
  3. 计算签名:使用客户端密钥对准备好的内容进行HMAC-SHA256签名。
  4. 构建认证头:将签名和其他必要的认证信息添加到Authorization请求头中。
  5. 发送请求:发送带有认证头的HTTP请求。
  6. 服务器验证:Akamai服务器验证签名的有效性,如果有效,则处理请求。

Akamai EdgeGrid 认证的关键组成部分

  1. 客户端令牌 (Client Token):用于标识API客户端的唯一标识符。
  2. 访问令牌 (Access Token):用于授权客户端访问特定资源的令牌。
  3. 客户端密钥 (Client Secret):用于生成请求签名的密钥,必须安全存储。
  4. 时间戳:请求的时间,格式为YYYYMMDDTHH:MM:SS+0000。
  5. 随机数 (Nonce):防止重放攻击的随机字符串。
  6. 签名:基于请求内容和认证信息计算的HMAC-SHA256签名。

如何使用 Akamai EdgeGrid 认证

获取API凭证

首先,您需要从Akamai Control Center获取API凭证:

  1. 登录到Akamai Control Center。
  2. 导航到"Identity & Access Management" > "API管理"。
  3. 创建新的API客户端,或选择现有客户端。
  4. 为API客户端分配适当的权限。
  5. 下载API凭证文件,其中包含客户端令牌、访问令牌和客户端密钥。

实施EdgeGrid认证

以下是使用EdgeGrid认证发送API请求的基本步骤:

  1. 准备请求数据

    定义请求的方法、URL、头信息和请求体。

  2. 构建待签名内容

    格式为:{HTTP方法}\t{主机名}\t{请求路径}\t{规范化的请求头}\t{请求体部分哈希}\t

  3. 计算签名

    使用客户端密钥对待签名内容进行HMAC-SHA256签名。

  4. 构建Authorization头

    格式为:Authorization: EG1-HMAC-SHA256 client_token=<客户端令牌>;access_token=<访问令牌>;timestamp=<时间戳>;nonce=<随机数>;signature=<签名>

  5. 发送请求

    将构建的Authorization头添加到HTTP请求中并发送。

使用JavaScript实现EdgeGrid认证(使用akamai-edgegrid库)

const EdgeGrid = require('akamai-edgegrid');
const axios = require('axios');

// 配置EdgeGrid凭证
const edgeGridConfig = {
host: 'akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net',
clientToken: 'akaa-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx',
accessToken: 'akaa-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx',
clientSecret: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
maxBody: 131072, // 可选,默认为131072(128KB)
headersToSign: ['Content-Type'] // 可选,默认为空数组
};

// 创建EdgeGrid实例
const eg = new EdgeGrid(edgeGridConfig);

// 发送GET请求示例
async function getEdgeGridRequest(path) {
try {
// 准备请求选项
const requestOptions = {
url: `https://${edgeGridConfig.host}${path}`,
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
};

// 使用EdgeGrid对请求进行签名
eg.auth(requestOptions);

// 发送请求
const response = await axios(requestOptions);
return response.data;
} catch (error) {
console.error('EdgeGrid请求失败:', error.message);
if (error.response) {
console.error('响应状态:', error.response.status);
console.error('响应数据:', error.response.data);
}
throw error;
}
}

// 发送POST请求示例
async function postEdgeGridRequest(path, data) {
try {
// 准备请求选项
const requestOptions = {
url: `https://${edgeGridConfig.host}${path}`,
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
data: JSON.stringify(data)
};

// 使用EdgeGrid对请求进行签名
eg.auth(requestOptions);

// 发送请求
const response = await axios(requestOptions);
return response.data;
} catch (error) {
console.error('EdgeGrid请求失败:', error.message);
if (error.response) {
console.error('响应状态:', error.response.status);
console.error('响应数据:', error.response.data);
}
throw error;
}
}

// 使用示例
async function exampleRequests() {
try {
// 获取边缘DNS区域列表
const zones = await getEdgeGridRequest('/config-dns/v2/zones');
console.log('DNS区域:', zones);

// 创建新的边缘DNS记录
const newRecord = {
name: 'www.example.com',
type: 'A',
ttl: 3600,
rdata: ['192.0.2.1']
};
const createResult = await postEdgeGridRequest('/config-dns/v2/zones/example.com/names', newRecord);
console.log('创建记录结果:', createResult);
} catch (error) {
console.error('请求失败:', error);
}
}

exampleRequests();

使用Python实现EdgeGrid认证(使用akamai-edgegrid-python库)

from akamai.edgegrid import EdgeGridAuth, EdgeRc
import requests
import json

# 使用.edgerc配置文件(推荐方式)
def from_edgerc_file():
# 从~/.edgerc文件加载凭证
edgerc = EdgeRc('~/.edgerc')
section = 'default'

# 创建session并设置认证
session = requests.Session()
session.auth = EdgeGridAuth(
client_token=edgerc.get(section, 'client_token'),
client_secret=edgerc.get(section, 'client_secret'),
access_token=edgerc.get(section, 'access_token'),
max_body=edgerc.getint(section, 'max_body')
)

# 设置基础URL
baseurl = 'https://%s' % edgerc.get(section, 'host')

return session, baseurl

# 手动设置凭证
def manual_credentials():
# 手动设置凭证
session = requests.Session()
session.auth = EdgeGridAuth(
client_token='akaa-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx',
client_secret='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
access_token='akaa-xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx'
)

# 设置基础URL
baseurl = 'https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net'

return session, baseurl

# 发送GET请求
def get_request(session, baseurl, path):
"""发送GET请求到Akamai API"""
url = f'{baseurl}{path}'
response = session.get(url)
response.raise_for_status() # 检查HTTP错误
return response.json()

# 发送POST请求
def post_request(session, baseurl, path, data):
"""发送POST请求到Akamai API"""
url = f'{baseurl}{path}'
headers = {'Content-Type': 'application/json'}
response = session.post(url, headers=headers, json=data)
response.raise_for_status() # 检查HTTP错误
return response.json()

# 使用示例
def main():
try:
# 使用配置文件创建会话
session, baseurl = from_edgerc_file()

# 获取DNS区域列表
zones = get_request(session, baseurl, '/config-dns/v2/zones')
print('DNS区域:', json.dumps(zones, indent=2))

# 创建新的DNS记录
new_record = {
'name': 'www.example.com',
'type': 'A',
'ttl': 3600,
'rdata': ['192.0.2.1']
}
result = post_request(session, baseurl, '/config-dns/v2/zones/example.com/names', new_record)
print('创建记录结果:', json.dumps(result, indent=2))

except Exception as e:
print(f'错误: {str(e)}')

if __name__ == '__main__':
main()

Akamai EdgeGrid 的优势

  • 安全性:使用密码学签名确保请求的完整性和真实性,防止请求被篡改或伪造。
  • 防止重放攻击:通过使用时间戳和随机数,可以防止请求被重放。
  • API专用设计:专为API设计,与Akamai API网关紧密集成。
  • 细粒度控制:可以配置细粒度的访问控制,限制API客户端只能访问特定的资源或执行特定的操作。
  • 审计跟踪:每个API请求都会记录客户端身份,便于审计和问题排查。
  • 无状态:认证机制是无状态的,不需要在服务器端存储会话信息,有利于水平扩展。

安全建议

在使用Akamai EdgeGrid认证时,应注意以下安全措施:

  • 安全存储密钥:客户端密钥应安全存储,避免泄露。
  • 使用HTTPS:所有API请求都应通过HTTPS发送,防止中间人攻击。
  • 最小权限原则:为API客户端分配最小必要的权限,减少潜在风险。
  • 定期轮换密钥:定期更换API凭证,减少长期凭证泄露的风险。
  • 监控API使用情况:定期检查API使用日志,及时发现异常活动。
  • 设置IP访问限制:如果可能,限制API客户端只能从特定的IP地址访问。
  • 使用官方SDK:尽可能使用Akamai提供的官方SDK,它们实现了最佳实践并自动处理认证逻辑。

常见问题

  1. EdgeGrid认证与OAuth有什么区别?

    EdgeGrid认证是Akamai特有的认证机制,专为其API设计。它使用基于HMAC的签名机制,而OAuth是一个通用的授权框架,侧重于第三方授权访问。EdgeGrid认证更加轻量级,专注于API认证,而不涉及授权流程。

  2. 如何排查EdgeGrid认证失败问题?

    常见的EdgeGrid认证失败原因包括:

    • 凭证错误:客户端令牌、访问令牌或客户端密钥不正确。
    • 时钟偏差:客户端和服务器时间相差超过30秒。
    • 权限不足:API客户端没有权限访问请求的资源。
    • 签名计算错误:请求签名计算有误,可能是因为使用了错误的算法或参数。

    排查步骤:

    • 验证API凭证是否正确。
    • 确保系统时钟与标准时间同步。
    • 查看API客户端的权限配置。
    • 使用官方SDK或库来处理签名计算。
  3. 一个API客户端可以访问哪些Akamai API?

    API客户端的访问权限取决于在Akamai Control Center中为其分配的权限。Akamai使用基于角色的访问控制(RBAC)系统,可以为每个API客户端配置细粒度的权限,限制其只能访问特定的API或执行特定的操作。

  4. 如何在多个环境中管理EdgeGrid凭证?

    对于多环境部署(如开发、测试、生产),建议:

    • 为每个环境创建独立的API客户端。
    • 使用配置文件(如.edgerc)分别存储不同环境的凭证。
    • 在应用程序中,根据当前环境加载相应的凭证。
    • 考虑使用密钥管理服务安全存储凭证。