【问题标题】:How to create a linux user using C/C++?如何使用 C/C++ 创建 linux 用户?
【发布时间】:2010-08-10 22:49:00
【问题描述】:

我想构建一个程序,它以用户名作为参数并创建用户及其主文件夹(具有一些硬编码规范,如文件夹,以及用户名等安全检查不能是 root 或现有用户)。

我的应用程序需要创建用户才能授予 SSH 访问权限。

程序将使用 sudo 执行。我读过它应该用 C 或 C++ 而不是脚本编写,因为脚本很容易被利用。

  • 您能否就如何实现这一目标给我一些建议或良好做法
  • 我应该使用一些 Pam 库吗?有例子吗?
  • 可能存在哪些安全漏洞?

我知道 C/C++,并运行 Ubuntu Lucid。

编辑:

用户只有 sudo 权限才能运行该特定命令,我不希望它能够运行 shell 或绕过某些程序(例如,通过更改 PATH 环境)。

因此,例如,我需要覆盖 PATH我还应该担心什么?

【问题讨论】:

  • 您的意思是adduseruseradd?尝试查看他们的源代码。
  • 为什么脚本比可执行文件更容易被利用?如果您有 root 访问权限,那么您就有了 root 访问权限,并且它们是您无能为力的。使用简单的方法并使用使用普通 linux 命令的脚本(因此已经过完全测试)。
  • 用户只有 sudo 访问权限才能运行该特定命令,我不希望它能够运行 shell 或绕过某些程序(例如,通过更改 PATH 环境)。

标签: c++ c linux


【解决方案1】:

您最好的选择可能是调用 useradd;它会做正确的事情(给定适当的参数)。

尝试通过调用适当的 API 手动创建一个是可能的,但不可取。

【讨论】:

  • 这听起来对我来说更可取。将 Perl 脚本放在一起,然后调用 useradd 是 认为解决此问题的方法。
  • Linux C 库中没有“适当的 API”。
【解决方案2】:

没有用于此的 API。您只需使用正常的文件访问系统调用写入/etc/passwd/etc/group(也可能是影子版本)。

【讨论】:

  • 不要忘记,在修改这些值之前,您应该始终获得文件的排他锁(所有修改这些文件的系统命令都会这样做)。否则有可能文件损坏,然后你的状态就很糟糕了。
  • 如果您的 /etc/passwd 为空白,我认为这是“唯一方法”,因此您无法使用 adduser 将用户添加到组中
【解决方案3】:

其实有一种C API方法可以创建Linux用户。它在 pwd.h 包含文件中。

这里有一个示例测试:

#include <pwd.h>
#include <stdio.h>
#include <string.h>

static void createUser(char *userName, char *homeDir, int uid) {
    struct passwd * pwd = getpwent ();
    struct passwd pwd2;

    pwd =  getpwnam(userName);
    if (pwd != NULL) {
        return;
    }
    pwd2.pw_dir = homeDir;
    pwd2.pw_gecos=userName;
    pwd2.pw_name=userName;
    pwd2.pw_gid=uid;
    pwd2.pw_uid=uid;
    pwd2.pw_shell=strdup("/bin/bash");
    FILE *f = fopen("/etc/passwd", "a");
    if (f != NULL) {
        putpwent(&pwd2, f);
        fclose(f);
    }
    free (pwd2.pw_shell);
}

int main (int argc, char **argv) {
   createUser("test", "/home/test", 12345");
   return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 2015-02-15
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多