1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
| #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <pwd.h> #include <grp.h> #include <string.h>
// 用户信息结构体 struct user_info { uid_t uid; gid_t gid; char username[256]; char groupname[256]; char homedir[256]; int is_root; int has_privileges; };
// 获取用户信息 int get_user_information(struct user_info *info) { struct passwd *pwd; struct group *grp; // 获取 UID 和 GID info->uid = geteuid(); info->gid = getegid(); // 获取用户信息 pwd = getpwuid(info->uid); if (pwd) { strncpy(info->username, pwd->pw_name, sizeof(info->username) - 1); info->username[sizeof(info->username) - 1] = '\0'; strncpy(info->homedir, pwd->pw_dir, sizeof(info->homedir) - 1); info->homedir[sizeof(info->homedir) - 1] = '\0'; } else { snprintf(info->username, sizeof(info->username), "uid_%d", info->uid); strcpy(info->homedir, "/tmp"); } // 获取组信息 grp = getgrgid(info->gid); if (grp) { strncpy(info->groupname, grp->gr_name, sizeof(info->groupname) - 1); info->groupname[sizeof(info->groupname) - 1] = '\0'; } else { snprintf(info->groupname, sizeof(info->groupname), "gid_%d", info->gid); } // 设置权限标志 info->is_root = (info->uid == 0); info->has_privileges = (info->uid == 0 || info->gid == 0); return 0; }
// 显示用户信息 void display_user_info(const struct user_info *info) { printf("=== 当前用户信息 ===\n"); printf("用户名: %s\n", info->username); printf("用户 ID: %d\n", info->uid); printf("组名: %s\n", info->groupname); printf("组 ID: %d\n", info->gid); printf("主目录: %s\n", info->homedir); printf("权限状态: %s\n", info->is_root ? "ROOT 权限" : info->has_privileges ? "特权用户" : "普通用户"); }
// 权限验证函数 int check_operation_permission(const char *operation) { struct user_info info; get_user_information(&info); printf("权限检查: %s\n", operation); // 根据操作类型检查权限 if (strcmp(operation, "read_system_files") == 0) { // 读取系统文件通常需要 root 权限 return info.is_root ? 1 : 0; } else if (strcmp(operation, "write_user_files") == 0) { // 写入用户文件通常只需要有效权限 return 1; // 假设总是允许 } else if (strcmp(operation, "network_admin") == 0) { // 网络管理需要 root 权限 return info.is_root ? 1 : 0; } else { // 默认情况下,普通操作允许 return 1; } }
// 模拟受保护操作 void perform_protected_operation(const char *operation) { printf("\n--- 尝试执行操作: %s ---\n", operation); if (check_operation_permission(operation)) { printf("✓ 权限检查通过\n"); printf(" 执行操作: %s\n", operation); // 模拟操作执行 if (strcmp(operation, "read_system_files") == 0) { printf(" 读取 /etc/shadow...\n"); printf(" 读取系统配置文件...\n"); } else if (strcmp(operation, "network_admin") == 0) { printf(" 配置网络接口...\n"); printf(" 修改防火墙规则...\n"); } printf(" 操作完成\n"); } else { printf("✗ 权限不足,拒绝执行操作\n"); printf(" 需要 ROOT 权限才能执行此操作\n"); } }
// 显示安全建议 void show_security_advice(const struct user_info *info) { printf("\n=== 安全建议 ===\n"); if (info->is_root) { printf("⚠ 警告: 当前以 ROOT 权限运行\n"); printf(" 建议:\n"); printf(" 1. 完成必要操作后立即切换到普通用户\n"); printf(" 2. 避免在 root 权限下运行不必要的程序\n"); printf(" 3. 定期审计 root 权限的使用情况\n"); } else if (info->has_privileges) { printf("⚠ 注意: 具有特权权限\n"); printf(" 建议:\n"); printf(" 1. 谨慎使用特权功能\n"); printf(" 2. 遵循最小权限原则\n"); } else { printf("✓ 信息: 以普通用户权限运行\n"); printf(" 建议:\n"); printf(" 1. 如需特权操作,请使用 sudo\n"); printf(" 2. 保持系统和软件更新\n"); } }
int main() { struct user_info current_user; printf("=== 高级身份验证和权限管理系统 ===\n\n"); // 获取并显示用户信息 get_user_information(¤t_user); display_user_info(¤t_user); // 执行各种受保护操作 perform_protected_operation("read_system_files"); perform_protected_operation("write_user_files"); perform_protected_operation("network_admin"); // 显示安全建议 show_security_advice(¤t_user); printf("\n=== 系统信息 ===\n"); printf("进程 ID: %d\n", getpid()); printf("父进程 ID: %d\n", getppid()); printf("真实 UID: %d\n", getuid()); printf("有效 UID: %d\n", geteuid()); printf("真实 GID: %d\n", getgid()); printf("有效 GID: %d\n", getegid()); return 0; }
|