タグ付けされた質問 「setuid」

8
シェルスクリプトでsetuidを許可する
setuid許可ビットではなく、エグゼキュータの所有者の実効ユーザーIDを使用してプログラムを実行するためのLinuxに指示します: > cat setuid-test.c #include <stdio.h> #include <unistd.h> int main(int argc, char** argv) { printf("%d", geteuid()); return 0; } > gcc -o setuid-test setuid-test.c > ./setuid-test 1000 > sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test > ./setuid-test 65534 ただし、これは実行可能ファイルにのみ適用されます。シェルスクリプトはsetuidビットを無視します。 > cat setuid-test2 #!/bin/bash id -u > ./setuid-test2 1000 > …

2
setuidビットを適切に使用する
通常のユーザーが実行するときにルート権限が必要なプロセスがあります。どうやら私はこれを達成するために「setuidビット」を使用することができます。POSIXシステムでこれを行う適切な方法は何ですか? また、インタープリター(bash、perl、python、phpなど)を使用するスクリプトでこれを行うにはどうすればよいですか?
45 scripting  setuid 

6
ルート権限でプログラムでファイルに書き込むための最も安全な方法は何ですか?
巨大なアプリケーションは、ある特定の時点で、ルート権限を必要とするファイルへの少数の書き込みを実行する必要があります。実際にはファイルではなく、ファイルとしてLinuxに公開されるハードウェアインターフェイスです。 アプリケーション全体にルート権限を付与しないようにするために、重要なタスクを実行するbashスクリプトを作成しました。たとえば、次のスクリプトは、出力としてハードウェアインターフェイスのポート17を有効にします。 echo "17" > /sys/class/gpio/export echo "out" > /sys/class/gpio/gpio17/direction しかし、suid私のシステムのbashスクリプトでは無効になっているため、これを達成するための最良の方法は何でしょうか。 ここに提示されている回避策を使用してください sudoメインアプリケーションからを使用してスクリプトを呼び出し、それに応じてsudoersリストを編集して、スクリプトの呼び出し時にパスワードを要求しないようにします。にsudo権限を付与するのは少し不快ですecho。 でCプログラムを作成しfprintf、suid rootに設定します。文字列とファイル名をハードコーディングし、rootのみが編集できることを確認してください。または、テキストファイルから文字列を読み取り、同様に誰もファイルを編集できないようにします。 私が思いつかなかった他の解決策は、上記のものよりも安全または簡単ですか?

1
このglibc問題を回避する最良の方法は何でしょうか?
私は、ファイル機能を使用して、setuid-rootバイナリ(たとえば/bin/ping、CAP_NET_RAWなど)の必要性のほとんどを排除するGentoo Hardenedボックスを管理しています。 実際、私が残した唯一のバイナリはこれです: abraxas ~ # find / -xdev -type f -perm -u=s /usr/lib64/misc/glibc/pt_chown abraxas ~ # setuidビットを削除するか、ルートファイルシステムを再マウントするnosuidと、sshdとGNU Screenが動作を停止しますgrantpt(3)。これらはマスターの擬似端末を呼び出し、glibcはこのプログラムを実行してスレーブの擬似端末をchownおよびchmodする/dev/pts/ためです。失敗します。 問題は、grantpt(3)Linuxの場合、devptsファイルシステムがマウントされていると、そのようなヘルパーバイナリは不要であると明示的に記載されているマンページです。カーネルは、スレーブのUIDとGIDを、/dev/ptmx(呼び出しによりgetpt(3))開いたプロセスの実際のUIDとGIDに自動的に設定します。 これを示すために、小さなサンプルプログラムを作成しました。 #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> int main(void) { int master; char slave[16]; struct stat slavestat; if ((master = getpt()) < 0) { …

1
所有者/ルートとRUID / EUIDの違い
私は質問で言及された概念に比較的新しく、異なるソースからそれらについて読むことはそれらをより混乱させるだけです。これは私がこれまでのところ理解したことです: ファイルのアクセス許可が与えられると、次のようになります。 -rwsr-xr-- 1 user1 users 190 Oct 12 14:23 file.bin user2グループ内のユーザーがusers実行しようとすると仮定しますfile.bin。setuidビットが設定されていない場合、これはRUIDとEUIDの両方file.binがUIDと等しいことを意味しuser2ます。ただし、setuidビットが設定されているため、これはRUIDがのUIDと等しいことを意味しますが、EUIDはuser2ファイルの所有者のUIDですuser1。 私の質問は: ファイルの所有者との違いは何rootですか?root所有者と同じ権限を持っていますか?または、アクセス許可リストに別のエントリが必要rootですか? RUIDとEUIDの違いは? 私が理解しているように、RUIDとEUIDはプロセスにのみ適用されます。その場合、なぜユーザーIDの値があるのですか? RUIDがプロセスを作成するユーザーであり、EUIDが現在プロセスを実行しているユーザーである場合、この質問の最初の回答の最初の文は意味がありません。 setuidビットの機能を正しく理解しましたか?

2
gdbはsuid rootプログラムをデバッグできますか?
とを呼び出すプログラムを作成setuid(0)しましたexecve("/bin/bash",NULL,NULL)。 それから私はやった chown root:root a.out && chmod +s a.out 実行する./a.outと、ルートシェルが取得されます。ただし、実行gdb a.outするとプロセスが通常のユーザーとして開始され、ユーザーシェルが起動します。 だから... setuid rootプログラムをデバッグできますか?
16 debugging  setuid  gdb 

2
Setuidビットはbashに影響を与えないようです
私は少し実験していて、奇妙なことに気付きました:にあるbashのコピーにsetuidビットを設定/usr/bin/bash-testしても効果がないようです。のインスタンスを実行したときbash-test、ホームディレクトリがに設定されておらず/root、whoamiコマンドを実行したときにbash-test、ユーザー名が報告されず、rootとして実行されていないrootことbash-testが示唆されました。ただし、setuidビットをonに設定するwhoamiと、予想どおりシェルのルートとして報告されました。 setuidビットもオンに設定してみて/usr/bin/bash、同じ動作を観察しました。 setuidビットを設定すると、bashがrootとして実行されないのはなぜですか?selinuxはこれと何か関係がありますか?
14 linux  bash  setuid 

3
GIDの意味?
GIDは実際にはどういう意味ですか? 私はそれをグーグルで調べましたが、これはlinux.about.comが言ったことです: プロセスのグループ識別番号。有効なグループ番号は/etc/group、および/etc/passwdファイルのGIDフィールドに記載されています。プロセスが開始されると、そのGIDは親プロセスのGIDに設定されます。 しかし、それはどういう意味ですか? 現在、私のフォルダに対する権限は次のとおりです。 0755 所有者のUIDを設定すると、 4755 そして、グループのGIDを設定すると、 2755 他の人にスティッキービットを設定すると、 1755 これらのアクセス許可を設定することも重要ですか?

1
setuidビットがオンのルート所有プログラム
Pingは、ユーザーIDビットが設定されたルートが所有するプログラムです。 $ ls -l `which ping` -rwsr-xr-x 1 root root 35752 Nov 4 2011 /bin/ping 私が理解しているように、ユーザーがpingプロセスを実行すると、実際のユーザーID(プロセスを起動した人のユーザーID)からユーザーIDルートに変わります。ただし、これを試し、psの出力を見て、pingプロセスがルートユーザーとして実行されているかどうかを確認しても、実際のユーザーIDが表示されます。 ps -e -o user,ruser,euser,cmd,args | grep ping sashan sashan sashan ping -i 10 -c 1000 www.goog ping -i 10 -c 1000 www.google.com

5
シェルスクリプトでルート権限を削除するにはどうすればよいですか?
OpenVPNの「--up」オプションは、通常、ルーティングなどに使用されます。したがって、OpenVPNがルート権限を削除して誰としても実行されない前に処理されます。ただし、非特権ユーザーとして実行する必要があるシェルスクリプトを呼び出しています。 それ、どうやったら出来るの?私が研究しているドロッププロセス特権、特に多項式のとtylerlの答えを、私は実装する方法を理解していません。私はCentos 6.5で作業していますが、「chmod u + s」と「setuid()」の両方として、suidがブロックされています。 OpenVPNプラグイン( "openvpn-down-root.so")があります。これにより、 "-down"オプションによって呼び出されたスクリプトをrootとして実行できます。「openvpn-up-user.so」などの同等のものがありますが、見つかりませんでした。 編集0 Nikola Koturの答えに従って、Ian Meyerのrunit-rpmをインストールしました。chpstコマンドは端末で機能しますが、アップスクリプトでは「command not found」で失敗します。動作するのは、「sudo chpst」に加えて、適切な表示と言語の設定です。端末がユニコード文字を正しく出力しないのはなぜですか?をご覧ください。そのため、upスクリプトには次の4行が必要です。 LANG="en_US.UTF-8"; export LANG GDM_LANG="en_US.UTF-8"; export GDM_LANG DISPLAY=:0; export DISPLAY sudo chpst -u user -U user /home/user/unprivileged.sh & 編集1 0xC0000022Lのコメントごとに、「sudo -u user」は「sudo chpst -u user -U user」と同様に機能することがわかりました。 LANG="en_US.UTF-8"; export LANG GDM_LANG="en_US.UTF-8"; export GDM_LANG DISPLAY=:0; export …

4
実際の効果的なユーザーIDはどのように機能しますか?
通常のユーザーがpasswdファイルに変更を加えたい場合、ユーザーはsetuidによって有効なユーザーアクセス権を与えられます。ユーザーは一時的にrootになり、passwdを編集できます。 ただし、パスワードを編集できるのはあなただけで、他の人は誰でも編集できませんか?ただし、有効なユーザーアクセスはルートです。それでは、どうしてあなた以外のパスワードを変更できないのですか? setuidを使用してプログラムを実行する場合、実際のユーザーはrootですが、実際のユーザーIDはまだあなたの名前であるとはどういう意味ですか?
13 setuid 


2
グループメンバーシップとsetuid / setgidプロセス
プロセスデエスカレート経由権限setuid()とsetgid()UID / GID彼らはセットのグループメンバーシップを継承していないようです。 特権ポートを開くためにrootとして実行する必要があるサーバープロセスがあります。その後、特定の非特権uid / gid 1にエスカレートします-たとえば、ユーザーfoo(UID 73)のuid / gid 。ユーザーfooはグループのメンバーですbar: > cat /etc/group | grep bar bar:x:54:foo したがって、としてログインするとfoo、/test.txt次の特性を持つファイルを読み取ることができます。 > ls -l /test.txt -rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt ただし、std=gnu99ルートを実行すると、次のCプログラム(コンパイル)が表示されます。 #include <stdio.h> #include <fcntl.h> #include <unistd.h> int main (void) { setgid(73); setuid(73); int fd = open("/test.txt", O_RDONLY); …

4
「sudo」はどのユーザーのパスワードを要求しますか?
$ ls -l /usr/bin/sudo -rwsr-xr-x 1 root root 136808 Jul 4 2017 /usr/bin/sudo そのためsudo、すべてのユーザーが実行でき、実行するすべてのユーザーはsudo、set-user-idビット/usr/bin/sudoが設定されているため、プロセスの実効ユーザーIDとしてrootを持ちます。 https://unix.stackexchange.com/a/11287/674から sudoとsuの最も明白な違いは、sudoはユーザーのパスワードを必要とし、suはrootのパスワードを必要とすることです。 どのユーザーのパスワードがsudo要求しますか?プロセスの実際のユーザーIDで表されるユーザーですか? はいの場合、実行sudoしてから自分のパスワードを入力することで、どのユーザーもスーパーユーザー権限を取得できますか?Linuxは一部のユーザーに対してそれを制限できますか? それはそれが正しいsudoパスワードを要求した後に execve()実行を開始するmain()の/usr/bin/sudo? プロセスのeuidがrootに変更されたため(/ usr / bin / sudoのset-user-idビットが設定されているため)、後でsudoがパスワードを要求するポイントは何ですか? ありがとう。 https://unix.stackexchange.com/a/80350/674を読みましたが、上記の質問には答えません。

2
setuidが実行可能ファイルで機能しないのはなぜですか?
スクリプトでsetuidを有効にするとセキュリティの問題が発生するため、デフォルトでは無効になっていますが、実行可能ファイルで機能することを期待しています。この投稿で説明されている手順に従って、出力としてuidを示す実行可能ファイルを作成しました。シェルスクリプトでsetuidを許可します しかし、実行前と実行後の両方で同じuid(1000)を返しますsudo chmod +s ./setuid-test。これは、setuidが実行可能ファイルに影響を与えないことを意味すると思います。なぜ、どのように解決するのですか? ソースコード: #include <stdio.h> #include <unistd.h> int main(int argc, char** argv) { printf("%d", geteuid()); return 0; } 構築して実行 $ gcc -o setuid-test setuid-test.c $ ./setuid-test 1000 $ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test $ ./setuid-test 1000 実行するとls -la、これは私が得るものです: me@me:~$ ls -la setuid-test -rwsrwsr-x 1 …

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