【问题标题】:mount ecryptfs with syscall in C language在 C 语言中使用 syscall 挂载 ecryptfs
【发布时间】:2015-02-12 12:35:17
【问题描述】:

我正在尝试在 C 中的程序中使用 ecryptfs 挂载 fs。 但我没有设法将密钥交给内核部分

int mount_crypt(char* source)
{
  int   r     = -1;
  char  opt[1024] = "ecryptfs_sig=f83de0de4ecccbb1,ecryptfs_cipher=aes,ecryptfs_key_bytes=16";

  r = mount(source, source, "ecryptfs", MS_MGC_VAL, opt);
  if (r != 0)
    {
      perror("EErrr mount cry");
      printf("Error mount cry: %d\n", r);
    }
  return (r);
}

在 /var/log/messages 中:

process_request_key_err: No key
One or more global auth toks could not properly register; rc = [-2]

我尝试在 opt 字符串中使用这个:

key=passphrase:passphrase_passwd=MYPASSS

但它不起作用

与:

int  icloud_mount_crypt(char* source)
{
  int   r     = -1;
  char  opt[1024] = "key=passphrase:passphrase_passwd=XXXXXX,ecryptfs_sig=f83de0de4ecccbb1,ecryptfs_cipher=aes,ecryptfs_key_bytes=16";

  r = mount(source, source, "ecryptfs", MS_MGC_VAL, opt);
  if (r != 0)
    {
      perror("EErrr mount cry");
      printf("Error mount cry: %d\n", r);
    }
  return (r);
}

这里是日志:

Feb 15 11:15:41 nightmare kernel: [2847133.493005] ecryptfs_parse_options: eCryptfs: unrecognized option [key=passphrase:passphrase_passwd=XXXXXX]
Feb 15 11:15:41 nightmare kernel: [2847133.493022] Could not find key with description: [f83de0de4ecccbb1]
Feb 15 11:15:41 nightmare kernel: [2847133.493028] process_request_key_err: No key
Feb 15 11:15:41 nightmare kernel: [2847133.493032] Could not find valid key in user session keyring for sig specified in mount option: [f83de0de4ecccbb1]
Feb 15 11:15:41 nightmare kernel: [2847133.493035] One or more global auth toks could not properly register; rc = [-2]
Feb 15 11:15:41 nightmare kernel: [2847133.493039] Error parsing options; rc = [-2]

感谢您的帮助

【问题讨论】:

    标签: c mount system-calls ecryptfs


    【解决方案1】:

    您可能会发现mount.ecryptfs_private.c 的源代码很有用,因为它会构建挂载字符串,然后执行挂载。这是 pam_ecryptfs 在 Ubuntu 中用来挂载用户的加密主目录的 setuid 二进制文件。

    完全披露:我是mount.ecryptfs_private.c 的作者和eCryptfs 的维护者。

    【讨论】:

    • 谢谢。但是阅读代码,我看不到如何传递密钥,例如: mount -t ecryptfs /tmp/disk1 /tmp/disk1 -o rw,passphrase_passwd=XXXXXX,ecryptfs_sig=f83de0de4ecccbb1,ecryptfs_cipher=aes,在安装系统调用中很抱歉,但我不知道如何构建 opt mount 字符串
    【解决方案2】:

    事实上,在使用带有密钥管理工具的 mount syscall 之前,必须将密钥提供给内核(参见 man keyctl)

    见:https://bazaar.launchpad.net/~ecryptfs/ecryptfs/trunk/view/head:/src/utils/ecryptfs_add_passphrase.c

    https://bazaar.launchpad.net/~ecryptfs/ecryptfs/trunk/view/head:/src/libecryptfs/key_management.c

    代码示例:

    [...]

    from_hex(salt, ECRYPTFS_DEFAULT_SALT_HEX, ECRYPTFS_SALT_SIZE);
    r = ecryptfs_generate_passphrase_auth_tok(&auth_tok, auth_tok_sig_hex,
                        fekek, salt, passphrase);
    
    r = ecryptfs_add_passphrase_key_to_keyring(auth_tok_sig_hex,
                         passphrase,
                         salt);
    auth_tok_sig_hex[ECRYPTFS_SIG_SIZE_HEX] = '\0';
    
    if ((rc_long = keyctl(KEYCTL_LINK, KEY_SPEC_USER_KEYRING,
            KEY_SPEC_SESSION_KEYRING))) 
    {
      syslog(LOG_ERR, "Error attempting to link the user session "
         "keyring into the session keyring\n");
    }
    

    [...]

    r = mount(source, source, "ecryptfs", MS_MGC_VAL, opt);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多