web-dev-qa-db-ja.com

autofsマウント資格情報ファイルの正しいエスケープは何ですか?

CentOSで/etc/auto.mymountを使用してautofsを設定しました。このようなもの:

mymount -fstype=cifs,rw,noperm,credentials=/etc/auto.creds.svc_account ://winserver.domain.local/SharedFolder

これは機能しており、一部のマウントでは引き続き機能します。ただし、Windowsサーバーへの接続に使用されるアカウントのパスワードは変更されており、これにはあらゆる種類の特殊文字が含まれています。私の資格情報ファイル/etc/auto.creds.svc_accountは次のようになります。

username=svc_account
password=AbCd@a;abc{`B"[C\\~/fg9w(G':4##abC}d3.H}v,2]f+c

上記のパスワードを変更したことは明らかですが、実際のパスワードには英数字以外のさまざまな文字が含まれています。

/ var/log/messagesを見ると、次のことがわかります。

Status code returned 0xc000006d NT_STATUS_LOGON_FAILURE
CIFS VFS: Send error in SessSetup = -13
CIFS VFS: cifs_mount failed w/return code = -13

変更されたのはパスワードだけなので、なんとかしてエスケープする必要のある特殊文字がそこにあると思います。

そのパスワードをコマンドラインに入力すると、さまざまな特殊文字が原因でコマンドがフォールオーバーすることがわかりました。各特殊文字の前にバックスラッシュを付けることで処理できます。例えば:

password=AbCd@a\;abc{\`B\"[C\\\\~/fg9w\(G\':4##abC}d3.H}v,2]f+c

しかし、それはうまくいきませんでした、それで明らかに私は何かが欠けています。資格情報ファイルでエスケープする必要のある文字と、それらをエスケープする正しい方法を誰かが説明できますか?

5
Steve

他のCIFSマウントの場合と同様に、資格情報ファイルは_mount.cifs_によって読み取られると思います。そこで、 現在のcifs-utilsコードの_mount.cifs.c_ソースファイル を確認しました。これはバージョン6.3用である必要があります。 パスワードを読み取るためのコード はエスケープを解除しませんが、_parsed_mount_info_構造体のpasswordフィールドですべてのコンマが二重になっている点が異なります。 mount(2)呼び出し:

_/*
 * CIFS has to "escape" commas in the password field so that they don't
 * end up getting confused for option delimiters. Copy password into pw
 * field, turning any commas into double commas.
 */
static int set_password(struct parsed_mount_info *parsed_info, const char *src)
{
    char *dst = parsed_info->password;
    unsigned int i = 0, j = 0;

    while (src[i]) {
        if (src[i] == ',')
            dst[j++] = ',';
        dst[j++] = src[i++];
        if (j > sizeof(parsed_info->password)) {
            fprintf(stderr, "Converted password too long!\n");
            return EX_USAGE;
        }
    }
    dst[j] = '\0';
    parsed_info->got_password = 1;
    return 0;
}
_

資格情報ファイルの場合、srcは、_=_記号のすぐ後ろのパスワード行の位置を指します。 _=_記号とfgets()によって読み取られた行の終わりの間のすべてがパスワードフィールドにコピーされます。 (改行はコピーする前にnullバイトで置き換えられます。)ただし、環境変数、オプション、またはstdinからパスワードを設定する他のすべての方法では、同じルーチンが呼び出されるため、ボリュームのマウントがコマンドラインから機能する場合は、そのコンマの二重化は原因ではありません。

ただし、行の末尾に空白が含まれている場合や、資格情報ファイルにUNIX以外の行が含まれている場合は、問題が発生する可能性があります。末尾のCRは、他の末尾の空白と同様に、パスワードの一部として読み取られます。同様に、パスワードにASCII以外の文字が含まれている場合、ファイルのエンコードが重要になるため、パスワードの読み取りに失敗する可能性があります。

TL、DR:

  • パスワードでエスケープする必要はありません
  • コマンドラインからCIFSボリュームのマウントが機能するかどうかを確認します
  • パスワード行の末尾の空白を確認します
  • 資格情報ファイルがUNIX形式であり、DOS行末がないかどうかを確認します
  • パスワードにASCII以外の文字(ウムラウトなど)がないか確認してください
  • カンマなしのパスワードで機能するかどうかを確認します(実際には違いはありませんが、誰が知っていますか)
5
Dubu

ファイル内に、おそらく=記号の間のスペースがありますか? -13エラーは、次のリンクのように、credsファイルのスペースが原因で発生する可能性があります。 http://thinkinginsoftware.blogspot.com/2011/09/cifs-vfs-cifsmount-failed-return-code.html

私自身の考えでも、これはファイル自体のエンコーディングの問題が原因である可能性があるのではないかと考えています。 file -bi /etc/auto.creds.svc_accountは何を返しますか?おそらく、迷走制御文字がありますか? vimでファイルを開いて:set listを実行すると何が表示されますか?おそらく、これまでパスワードに存在していなかった特定の文字でのみ使用されるエンコーディングが「爆発」するため、以前は問題ではありませんでした。これをトラブルシューティングする最も簡単な方法は、ファイルを再作成して再試行するか、古い作業パスワードを新しいパスワードと比較して、どの新しい特殊文字が導入されたかを判断することです。

1
usedTobeaMember

これに答えるには遅すぎるかどうかはわかりませんが、この問題を抱えている他の人のために、CentOS6で壁に頭をぶつけて数時間過ごしましたVM try Windows7ホスト上のcifs共有にアクセスします。

結局、私にとってうまくいったのは、資格情報ファイルのパスワード行を変更して、パラメーター名として「pass」を使用することでした。例えば.

user=myUserName
domain=MYDOMAIN
pass=myStrongPasswordWithSpecialCharacters

ファイルの解析時に、パスワードの特殊文字について何か問題があったかどうかはわかりませんが、ユーザー名とパスワードがユーザーに解析されて渡されていることに気付いたので、これらの値を直接入力することでそのステップを省略しましたファイル内。

これが誰かに役立つことを願っています。

1
jackos

8進数のASCIIコードを特殊文字に使用できるはずです。例:

SPACE = \040
AMPERSAND = \046

コンサルトASCII表はこちら: http://www.asciitable.com/

解決策は次の場所にあります: http://www.linuxforums.org/forum/ubuntu-linux/175662-solved-fstab-special-characters.html

0
phoops