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; 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) { return info.is_root ? 1 : 0; } else if (strcmp(operation, "write_user_files") == 0) { return 1; } else if (strcmp(operation, "network_admin") == 0) { 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; }
|