4

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]

手伝ってくれてありがとう

4

2 に答える 2

1

実際には、キー管理機能でマウント 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);
于 2015-02-18T09:29:32.317 に答える
1

mount.ecryptfs_private.cマウント文字列を作成してからマウントを実行するため、ソース コードが役立つ場合があります。pam_ecryptfsこれは、ユーザーの暗号化されたホーム ディレクトリをマウントするために Ubuntu で使用される setuid バイナリです。

完全な開示: 私はeCryptfsmount.ecryptfs_private.cの作成者であり、メンテナーです。

于 2015-02-12T15:17:10.420 に答える