NHI扫描MCP
MCP服务器,用于扫描AWS IAM身份并识别非人类身份(NHI),如服务帐户、自动化用户和机器身份。
概述
此工具扫描AWS IAM用户和角色,以区分人类用户和非人类身份。它分析命名模式、身份验证方法、访问密钥、MFA配置和IAM标签,以使用置信度对身份进行分类。可选地包括详细的权限分析,以评估访问级别并识别潜在的危险权限。
特性
- 扫描AWS帐户中的所有IAM用户和角色
- 通过置信度评分将身份分为人类或非人类
- 按类型(服务角色、机器用户、Lambda执行角色等)对NHI进行分类
- 可选权限分析和访问级别评估
- 识别危险的权限和潜在的安全风险
安装
需求
- Python 3.10或更高版本
- 具有IAM读取权限的AWS凭据
设置
克隆存储库并安装依赖项:
git clone https://github.com/yourusername/NHI-scan-mcp.git
cd NHI-scan-mcp
pip install -r requirements.txt开发模式:
pip install -e .使用Claude桌面和光标
Claude桌面配置
将NHI Scan MCP服务器添加到您的Claude Desktop配置文件中:
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
窗户: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"nhi-scan": {
"command": "python",
"args": ["-m", "nhi_scan_mcp"],
"cwd": "/absolute/path/to/NHI-scan-mcp",
"env": {
"AWS_ACCESS_KEY_ID": "your-key-id",
"AWS_SECRET_ACCESS_KEY": "your-secret-key",
"AWS_DEFAULT_REGION": "us-east-1"
}
}
}
}配置后,重新启动Claude Desktop。当您询问有关AWS IAM安全性的问题时,Claude将自动使用NHI扫描工具。
光标配置
将MCP服务器添加到游标配置中:
- 打开光标设置
- 引导到 特性→ MCP
- 添加具有以下配置的新MCP服务器:
{
"mcpServers": {
"nhi-scan": {
"command": "python",
"args": ["-m", "nhi_scan_mcp"],
"cwd": "/absolute/path/to/NHI-scan-mcp",
"env": {
"AWS_ACCESS_KEY_ID": "your-key-id",
"AWS_SECRET_ACCESS_KEY": "your-secret-key",
"AWS_DEFAULT_REGION": "us-east-1"
}
}
}
}或创建/编辑 .cursor/mcp_settings.json 在项目根目录中:
{
"mcpServers": {
"nhi-scan": {
"command": "python",
"args": ["-m", "nhi_scan_mcp"],
"cwd": "/absolute/path/to/NHI-scan-mcp"
}
}
}配置后,重新启动Cursor。现在,您可以要求AI助手扫描您的AWS IAM以查找NHI。
示例提示
配置后,您可以询问Claude或Cursor:
- “扫描我的AWS IAM并向我显示所有非人类身份”
- “以高置信度列出我的AWS帐户中的所有服务帐户”
- “分析我当前AWS凭据的权限”
- “向我展示具有安全建议的人类用户与非人类身份”
- “获取名为'jenkins automation'的IAM用户的详细信息”
手动使用
启动服务器
python -m nhi_scan_mcp或者:
python src/nhi_scan_mcp/server.pyMCP工具
服务器提供了五个用于IAM扫描和分析的工具:
scan_iam_identities
主扫描工具,列出所有IAM身份,对NHI进行分类,并可选择分析权限。
参数:
aws_access_key_id(字符串,可选)-AWS访问密钥IDaws_secret_access_key(字符串,可选)-AWS秘密访问密钥aws_session_token(字符串,可选)-临时凭据的会话令牌region(字符串,可选)-AWS区域,默认为us-east-1include_permissions(布尔值,可选)-包括权限分析,默认为false
例子:
{
"aws_access_key_id": "AKIA...",
"aws_secret_access_key": "...",
"region": "us-west-2",
"include_permissions": true
}退货: 完整的扫描结果,包括所有身份、NHI分类、置信度评分和可选的权限分析。
list_nhi_identities
仅返回经过置信阈值过滤的非人类身份。
参数:
aws_access_key_id(字符串,可选)aws_secret_access_key(字符串,可选)aws_session_token(字符串,可选)region(字符串,可选)min_confidence(浮动,可选)-最小置信阈值(0.0-1.0),默认为0.5
退货: 符合置信阈值的NHI过滤列表,包含分类详细信息。
analyze_caller_permissions
分析用于运行扫描的AWS凭据的权限。
参数:
aws_access_key_id(字符串,可选)aws_secret_access_key(字符串,可选)aws_session_token(字符串,可选)region(字符串,可选)
退货: 呼叫者的权限分析,包括访问级别和危险权限。
get_identity_details
检索特定IAM用户或角色的详细信息。
参数:
identity_name(字符串,必填)-IAM用户或角色的名称identity_type(string,可选)-“user”或“role”,默认为useraws_access_key_id(字符串,可选)aws_secret_access_key(字符串,可选)aws_session_token(字符串,可选)region(字符串,可选)
退货: 完整的身份信息,包括NHI分类和权限分析。
distinguish_users_vs_nhi
提供将人类用户与非人类身份区分开来的细分,并提供统计数据和建议。
参数:
aws_access_key_id(字符串,可选)aws_secret_access_key(字符串,可选)aws_session_token(字符串,可选)region(字符串,可选)
退货: 汇总统计数据、按类别列出的用户列表和安全建议。
AWS凭据
凭据可以按以下优先级顺序提供:
- 显式参数(
aws_access_key_id,aws_secret_access_key) - 环境变量(
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - AWS凭据文件(
~/.aws/credentials) - IAM角色(在EC2/ECS上运行时)
所需IAM权限
AWS凭据必须具有以下权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ListUsers",
"iam:ListRoles",
"iam:ListUserTags",
"iam:ListRoleTags",
"iam:ListAccessKeys",
"iam:ListMFADevices",
"iam:GetUser",
"iam:GetRole",
"iam:ListAttachedUserPolicies",
"iam:ListAttachedRolePolicies",
"iam:ListUserPolicies",
"iam:ListRolePolicies",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:GetUserPolicy",
"iam:GetRolePolicy",
"iam:ListGroupsForUser",
"sts:GetCallerIdentity"
],
"Resource": "*"
}
]
}NHI识别方法
IAM用户
该工具评估多个信号以确定用户是否非人类:
- 名称模式 -匹配常见前缀,如
svc-,app-,bot-,api-,lambda-,ci-,cd-,terraform-,ansible-等等。 - 密码使用 -没有密码登录历史记录的用户
- 访问密钥 -存在活动的编程访问密钥
- MFA状态 -缺少MFA设备(预期供人类用户使用)
- 标签 -标记服务帐户、机器人或自动化的显式标签
每个信号对0.0到1.0的置信度得分都有贡献。置信度≥0.5的用户被归类为NHI。
IAM角色
所有角色本质上都是非人类的,但通过分析其承担角色策略,可以进一步分类:
- 服务角色 -受AWS服务(Lambda、EC2、ECS等)信任
- Lambda执行角色 -专门用于Lambda函数
- EC2实例配置文件 -对于EC2实例
- 跨帐户角色 -与其他AWS帐户的信任关系
- 联合角色 -SAML或OIDC联盟
- 应用程序角色 -一般应用程序服务角色
Python库用法
您也可以直接在自己的Python脚本中使用这些模块:
基本扫描示例
from nhi_scan_mcp.aws_scanner import AWSIAMScanner
from nhi_scan_mcp.nhi_identifier import NHIIdentifier
# Initialize scanner (uses default AWS credential chain)
scanner = AWSIAMScanner()
# Or with explicit credentials:
# scanner = AWSIAMScanner(
# aws_access_key_id="YOUR_KEY",
# aws_secret_access_key="YOUR_SECRET",
# region_name="us-east-1"
# )
# Get caller identity
caller = scanner.get_caller_identity()
print(f"Account: {caller['Account']}")
# List all IAM users and roles
users = scanner.list_users()
roles = scanner.list_roles()
print(f"Found {len(users)} users and {len(roles)} roles")
# Identify NHIs
identifier = NHIIdentifier()
identifications = identifier.identify_all(users, roles)
# Display results
for identification in identifications:
if identification.is_nhi and identification.identity.identity_type == "user":
print(f"🤖 {identification.identity.name}")
print(f" Category: {identification.nhi_category}")
print(f" Confidence: {identification.confidence:.2f}")权限分析示例
from nhi_scan_mcp.aws_scanner import AWSIAMScanner
from nhi_scan_mcp.permission_analyzer import PermissionAnalyzer
# Initialize scanner and analyzer
scanner = AWSIAMScanner()
analyzer = PermissionAnalyzer(scanner)
# Analyze your own permissions
caller_analysis = analyzer.analyze_caller_permissions()
print(f"Permission Level: {caller_analysis.permission_level}")
print(f"Admin Access: {caller_analysis.admin_access}")
if caller_analysis.dangerous_permissions:
print("⚠️ Dangerous Permissions:")
for perm in caller_analysis.dangerous_permissions:
print(f" - {perm}")
# Analyze specific user permissions
users = scanner.list_users()
for user in users:
analysis = analyzer.analyze_user_permissions(user)
print(f"{user.name}: {analysis.permission_level}")区分人类与NHI示例
from nhi_scan_mcp.aws_scanner import AWSIAMScanner
from nhi_scan_mcp.nhi_identifier import NHIIdentifier
scanner = AWSIAMScanner()
identifier = NHIIdentifier()
# Scan and identify
users = scanner.list_users()
roles = scanner.list_roles()
identifications = identifier.identify_all(users, roles)
# Separate human users from NHIs
human_users = []
nhi_users = []
uncertain_users = []
for identification in identifications:
if identification.identity.identity_type != "user":
continue
if identification.nhi_category.value == "human_user":
human_users.append(identification)
elif identification.nhi_category.value == "uncertain":
uncertain_users.append(identification)
else:
nhi_users.append(identification)
print(f"Human Users: {len(human_users)}")
print(f"NHI Users: {len(nhi_users)}")
print(f"Uncertain Users: {len(uncertain_users)}")
# Generate security recommendations
no_mfa_humans = [i for i in human_users if not i.identity.mfa_devices]
if no_mfa_humans:
print(f"\n⚠️ {len(no_mfa_humans)} human users lack MFA!")
for i in no_mfa_humans:
print(f" - {i.identity.name}")许可证
MIT许可证-有关详细信息,请参阅许可证文件。
