私たちのサーバーでは、複数(現在2人、3〜4人が期待されている)ユーザーがアプリケーションの新しいバージョンをデプロイできるようにします。このプロセスには、信頼できるソースGitリポジトリからいくつかのファイルをダウンロードしてアプリケーションを起動すること(無許可のプロセス)が含まれます。
これはすべて単一のスクリプトを使用して実行でき、わずか数秒しかかかりません。他のユーザーが間違った権限またはグループにファイルまたはディレクトリを残さない限り。
その後、展開が失敗して実行されます。
sudo chgrp -R sudo /our/root/directory
sudo chmod -R g=u,o-rwx /our/root/directory &&
パスワードを入力せずにこれを行うことができることを願っています。
私はこれがsetuid
シェルスクリプトでは機能しないことを知っています(妥当な理由があります)。 setuid perlスクリプトを使用しようとしましたが、サポートされなくなりました。 Cラッパーとスクリプトを書くことができますが、ファイルが2つあれば、快適でも安全でもありません。システムコールを使用すると、Cですべてのコンテンツを作成できますが、時間がかかります。
だから私はこう尋ねます。これを達成する簡単で安全な方法はありますか?短いCコードを書いてみてください。
重要な場合はUbuntu 16.04です。
sudo
(*)グループと権限、rwxrwx---
またはrw-rw----
ツリー全体を使用しています。
答え1
シェルスクリプトを作成し、sudoを使用してそれらを呼び出すための適切なユーザー権限を付与します。NOPASSWD
ユーザーがパスワードを入力できないようにするには、このディレクティブを使用してください(順序が重要です。パスワードを要求せずにルートで特定のプログラムをどのように実行できますか?)。
sudoが、環境内の一部の安全な変数(およびLC_*
)をLANG
除くすべての変数を削除するように設定されていることを確認してください。これはとにかくUbuntuでデフォルトで有効になっているため、UbuntuはDefaults
設定を変更しない限りこの行を必要としませんenv_reset
。
Defaults!/usr/local/bin/fix-our-permissions env_reset
%our-app-maintainers ALL = NOPASSWD: /usr/local/bin/fix-our-permissions
または、固定された所有権と権限を付与するファイルシステムを介して、人々が配布領域にアクセスできるようにします。ファイルシステムバインディング。バラよりフォルダに書き込むときにファイルの権限を自動的に変更します。そしてディレクトリに作成されたすべてのファイルはbobの所有者である必要があります。
ただし、実際には誰も手動で配布しないでください。展開は次のようにする必要があります。トリガー済み手動で行う必要がありますが実装CIからバージョンをインポートしてダウンロードしたら、システムユーザーアカウントで実行されている自動化サービスを介してデーモンを再起動します。
答え2
フォルダを監視するプログラムを作成し、問題が見つかった場合は、フォルダまたはコンテンツの権限を変更すると、Crontab(ルート)でこれを実行するか、サービス(ルート)実行にすることができます。これは代替案です。
答え3
必要な正確なchmodを使用するようにこれらのユーザーのumaskを変更して、システムに入力するすべてのアーカイブが定義された権限セットで開始されるようにすることができます。
リンクを残してくださいここ
答え4
ACL( ) を使用すると、setfacl
問題を防ぐことができます。
別の方法は、ファイルを新しい空のフォルダにダウンロードし、古いフォルダを置き換えることです。このフォルダのシンボリックリンク()を上書きすると、アトミックに実行できますln -sf
。