すべてのタイプの接続に対してsshのumaskをセットアップする方法


34

私は、セットアップのOpenSSHのへの道を探してきたのumask0027すべての接続タイプ間で一貫性のある方法で。

私が言及している接続タイプ別:

  1. sftp
  2. scp
  3. sshホスト名
  4. sshホスト名プログラム

3.と4.の違いは、前者は通常/etc/profile情報を読み取るシェルを起動するのに対し、後者は起動しないことです。

さらに、この投稿を読むことで、OpenSSHの新しいバージョンに存在する-uオプションに気付きました。ただし、これは機能しません。

また、/etc/profile今含まれていますumask 0027

ポイントごとに行く:

  • sftp- ここで述べたように設定-u 0027するだけでは不十分です。sshd_config

このパラメーターを設定しない場合、sftpはデフォルトでを使用しますumask 0022。これは、2つのファイルがある場合:

-rwxrwxrwx 1 user user 0 2011-01-29 02:04 execute
-rw-rw-rw- 1 user user 0 2011-01-29 02:04 read-write

sftpを使用して宛先マシンに配置すると、実際に次のようになります。

-rwxr-xr-x 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

ただし、宛先マシンに設定-u 0027するsshd_configと、実際に次のようになります。

-rwxr--r-- 1 user user 0 2011-01-29 02:04 execute
-rw-r--r-- 1 user user 0 2011-01-29 02:04 read-write

実際には次のようになっているはずなので、これは予期されていません。

-rwxr-x--- 1 user user 0 2011-01-29 02:04 execute
-rw-r----- 1 user user 0 2011-01-29 02:04 read-write

なぜこれが起こるのか誰でも理解していますか?

  • scp - sftpの設定に関係なく、許可は常にumask 0022。現在、これを変更する方法がわかりません。

  • sshホスト名-シェル/etc/profileはデフォルトで読み取りを行うため、ここでは問題はありませんumask 0027。これは現在のセットアップを意味します。

  • ssh hostname プログラム-scpと同じ状況。


要するに、上のumaskを設定することsftpはなく、それが必要として変更結果はssh hostname予想読書として動作/etc/profileし、両方scpssh hostname programしているように見えるumask 0022どこかをハードコーディング。

上記の点についての洞察は大歓迎です。

編集: opensshを手動でコンパイルする必要があるパッチを避けたい。システムはopenssh、maverickのパッケージを使用してUbuntu Server 10.04.01(明id)LTSを実行しています。

回答: poigeで示されているように、pam_umaskを使用するとうまくいきました。

正確な変更は次のとおりです。

に追加された行/etc/pam.d/sshd

# Setting UMASK for all ssh based connections (ssh, sftp, scp)
session    optional     pam_umask.so umask=0027

また、ソース/etc/profileかどうかに関係なくすべてのログインシェルに影響を与えるために、同じ行もに追加されました/etc/pam.d/login

編集:コメントのいくつかの後、私はこの問題を再テストしました。

少なくともUbuntu(私がテストした場所)では、ユーザーのシェルの初期化ファイル(.bashrc、.zshrc、...)に異なるumaskが設定されている場合、PAM umaskは無視され、代わりにユーザー定義のumaskが使用されるようです。の変更は/etc/profile、ユーザーがinitファイルでこれらの変更を明示的に提供しない限り、結果に影響しませんでした。

この動作がすべてのディストリビューションで発生するかどうかは、現時点では不明です。


Unode:「opensshを手動でコンパイルする必要があるパッチを避けたい」どうして?
-desasteralex

5
@desasteralex-(可能な場合)ソースベースのパッケージを使用することによる追加のメンテナンス/管理タスクを避けたいため、openshにパッチを適用する以外にumaskを変更する他の方法がないと信じられないため。これを特に考慮することは、どのシステムでもかなり基本的なセキュリティ面です。
うので

1
/etc/pam.d/sshd(およびログイン)を変更し、sshを再起動した後、動作に変更はありません。暗示されているがここで言及されていない他の必要な変更はありますか?
スティーブクレイ

@mrclay- UsePAM yessshd_configにありますか?
-Unode

1
ユーザーの.bashrcの問題を解決するには、でumaskコマンドをエイリアス化してみてください/etc/profile。何かalias umask=/bin/true
トビア

回答:


22

私は2つのことを試すことを提案できます:

  1. pam_umask
  2. LD_PRELOADラッパー(自己作成?)

1
1、pam_umaskははるかに簡単な解決策であると考えられる
フレキソ

pam_umaskはトリックを行います。答えを反映して詳しく説明するように編集質問
Unode

stackoverflow.com/q/10220531/220060を使用するだけです。ただし、何か間違ったタイプを入力すると、サーバーからロックアウトされます。現在のセッションを閉じる前に、再度ログインできるかどうかを常に確認してください。
nalply

1
@nalplyによってコメントを追加:バックアップ持っていることを確認したルート PAM手段を壊すので、あなたがすることができなくなり、セッションを開いたsudoか、sudo suなどが挙げられます。
-Zero3

13

ユーザーごとに必要なことを実行できるソリューションを次に示します。ネイティブsshd機能のみを使用し、ローカルでメンテナンスされるパッチをいじる必要はありません。このソリューションはForceCommand、sshd の動作を利用して、すべてのssh接続に環境設定スクリプトを挿入し、元のコマンドを実行します。

最初に、システムのどこかに次の内容のスクリプトを作成します。

#!/bin/sh

umask 0027
exec /bin/sh -c "${SSH_ORIGINAL_COMMAND:-$SHELL}"

この例の目的のために、あなたはこれを呼び出したと仮定します/usr/bin/umask-wrapper

さて、これを設定するにはいくつかのオプションがあります。これをすべてのユーザーの必須構成にしたい場合(これは少し考えられないようですが)、sshd構成を変更して以下を含めることができます。

ForceCommand /usr/bin/umask-wrapper

これを一部のユーザーにのみ適用したい場合は、Matchブロックを使用できます(これはの最後にありますsshd_config)。

Match User user1,user2
ForceCommand /usr/bin/umask-wrapper

これをユーザー制御可能な動作にするcommand=場合は、authorized_keyファイル内のオプションを使用して、特定のキーに対してこの動作を選択できます。たとえば、これをテストしながらauthorized_keys、次のようなエントリをファイルに追加しました。

command="/home/lars/bin/umask-wrapper" ssh-rsa AAAAB3NzaC1 ... umask-test

そして、ここに私のテストの結果があります:

sshコマンドなしで使用:

localhost$ ssh remotehost
remotehost$ touch umask-test/file1
remotehost$ ls -l umask-test/file1
-rw-r-----. 1 lars lars 0 Feb  2 06:02 file1

sshコマンドで使用する:

localhost$ ssh remotehost touch umask-test/file2
localhost$ ssh remotehost ls -l umask-test/file2
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file2

を使用してscp

localhost$ touch file3
localhost$ ls -l file3
-rw-r--r--  1 lars  staff  0 Feb  2 06:03 file3
localhost$ scp file3 remotehost:umask-test/file3
localhost$ ssh remotehost ls -l umask-test/file3
-rw-r-----. 1 lars lars 0 Feb  2 06:03 file3

を使用してsftp

localhost$ sftp remotehost
sftp> put file3 umask-test/file4
sftp> ls -l umask-test/file4
-rw-r-----    0 500      500             0 Feb  2 06:05 umask-test/file4

そして、あなたはそれを持っています。これがあなたが探していた行動だと思います。このソリューションについてご質問がある場合は、詳細をお知らせください。


この方法は機能しているように見えますが、メンテナンスの悪夢に少し見えます。それでも、PAMを使用できない場合は+1。
うのど

3
維持するのがそれほど難しいことはわかりません。PAMベースのソリューションに対する主な利点は、特別な特権を必要としないことです。管理者の介入なしに、自分のアカウントにこれを設定できます。
ラースク

選択したユーザーのリストを保持するという観点から考えていましたが、実際、単純なユーザー設定でこの機能が機能していることに気付きませんでした。初めて読んだとき、ForceCommandは「必須」であり、「設定の1つの方法」ではないと考えました。command=確かにsshのすばらしい機能です。
うのど

5

設定を一元化するために、少し異なるアプローチを取りました。

これはに追加されました/etc/pam.d/common-session

session    optional     pam_umask.so

これは次で変更されました/etc/login.defs

UMASK           0027

2

pam_umaskはsshで動作するようになりましたが、scpまたはsftpでは動作しません。

ラッパーメソッドは、sftpまたはscpに対しても何もしません。ほとんどのディストリビューションでは既にumaskが設定されているため、027が良い例かどうかはわかりません。002で試して、それが機能するかどうかを確認します。


1

独自のumaskを設定しないプログラムは、それを開始したアプリケーションのumaskを継承します。sshdを完全に停止し、umaskを0027に設定してから、再起動します。(今後の再起動のために、initスクリプトにumaskコマンドを追加できます。)

SCPで動作するようにテスト済み。


申し訳ありませんが、これは私が成功せずに試した最初のものの1つでした。すべてのログインシェルはumask 0027(もし読んだ場合/etc/profile)持っていますが、sshを再起動してもscpやsshには影響しません。
うので

1

場合はpam_umask、あなたのSFTPセッションに影響を与えるとは思われない場合は、チェックUsePamに設定されているYes/etc/ssh/sshd_configファイル。

パスワード認証を無効UsePamにし、設定またはデフォルト設定された場合No。そうしないと、そのシステムを介してパスワード認証を誤って有効にしてしまう可能性があるためChallengeResponseAuthentication Nosshd_configファイルに設定することをお勧めします。


1

上記のuser188737の回答に追加された注記:

これは言うまでもないかもしれませんが、openssh-serverパッケージを使用しておらず、OpenSSH を手動でコンパイルしている場合は、--with-pam構成フラグを渡して「PAMサポートを有効にする」ようにしてください。

それ以外の場合、UsePAM=yessshd_configで加えた変更は、/etc/pam.d/*によって事実上無視されsshdます。

推奨されるPAMソリューションのいずれも、非対話型SFTP接続を介したテストに影響を及ぼさない理由がようやくわかりました...


1

umaskは親プロセスから継承されるため、/etc/rc.d/rc.sshdsshdを開始/停止/再起動するために使用するSlackwareシステムでは、umask 0027「sshd_start」または「sshd_restart」のすぐ上、またはその前の任意の時点でメイン実行セクションは、以下で始まります/etc/rc.d/rc.sshd

case "$1" in
'start')
  umask 0027
  sshd_start
  ;;
'stop')
  sshd_stop
  ;;
'restart')
  umask 0027
  sshd_restart
  ;;
*)

または、代わりに、ファイルの先頭に:

#!/bin/sh
# Start/stop/restart the secure shell server:
umask 0027

0

solaris 11でlarsks sshd_configオプションの可能な改善をテストしました

管理対象のユーザーでグループを設定し、スクリプトを構成ファイル自体に移動します。私の場合、umaskを0002に設定します。

結果の構成は...になります

Match Group managedgroup
ForceCommand /bin/sh -c 'umask 0002; ${SSH_ORIGINAL_COMMAND:-$SHELL}'

0

私はこの問題、特にscpを使用してファイルをコピーした後のファイル許可に苦労しており、コピー後に許可を変更するために単にsshを使用するようになりました。

解決策は次のとおりです。

  1. ファイルをコピーします。 localhost$ scp filename remotehost:umask-test/filename
  2. 権限を修正: localhost$ ssh remotehost "chmod go+r umask-test/filename"

何よりも、このソリューションを実現するためにルートアクセスは必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.