2012-09-05 12 views
13

起動後、私のLinuxプログラムでroot特権を削除し、特権のないアカウントに切り替えることを希望します。私は具体的には、私の要件については、標準的な様々な例オンライン何も見つけた:は現代のLinuxでroot特権を永久に削除します

  1. が、これは永久的なドロップ
  2. 非ルート
  3. のみに切り替える必要があり、両方の(e)のuidと(e)はGIDですLinuxサポート(カーネル> 2.6.32)
  4. 補足グループは必要ありません

私が見つけた最良の方法は次のとおりです。

uid_t new_uid = ...; 
gid_t new_gid = ...; 

gid_t rgid, egid, sgid; 
if (setresgid(new_gid, new_gid, new_gid) < 0) 
{ 
    perror("setresgid"); 
    exit(EXIT_FAILURE); 
} 
if (getresgid(&rgid, &egid, &sgid) < 0) 
{ 
    perror("getresgid"); 
    exit(EXIT_FAILURE); 
} 
if (rgid != new_gid || egid != new_gid || sgid != new_gid) 
{ 
    printf("unexpected gid"); 
    exit(EXIT_FAILURE); 
} 

if (setgroups(0, 0) != 0) 
{ 
    perror("setgroups"); 
    exit(EXIT_FAILURE); 
} 

uid_t ruid, euid, suid; 
if (setresuid(new_uid, new_uid, new_uid) < 0) 
{ 
    perror("setresuid"); 
    exit(EXIT_FAILURE); 
} 
if (getresuid(&ruid, &euid, &suid) < 0) 
{ 
    perror("getresuid"); 
    exit(EXIT_FAILURE); 
} 
if (ruid != new_uid || euid != new_uid || suid != new_uid) 
{ 
    printf("unexpected uid"); 
    exit(EXIT_FAILURE); 
} 

私はexeファイルでこれをラップし、UIDとGIDを使用して、正しい表示されていることを証明することができます

ps -eO user,uid,ruid,suid,group,gid,rgid,sgid 

それがすべてですので、プログラムは、特権ポートに結合するか、またはほとんどのルート所有のファイルを操作することはできません良い。

また、プログラム(libcap-ng-utilsに含まれています)が見つかりました。プロセスが予期しないものであることを確認しますcapabilities(7)

しかし、セキュリティが重要なので、私はすべての重要でない特権を正しく落としたと自信を持っていたいと思います。どうすればわかりますか?

ありがとうございました。

+0

あなたは[setuidgid](http://cr.yp.to/daemontools/setuidgidをチェックアウトしまし.html)?それは、[D.J. Bernstein's](http://cr.yp.to/djb.html)[Daemon Toolsパッケージ](http://cr.yp.to/daemontools.html)。このプログラムのソースを確認することは役に立ちます。 –

+0

これをどのように達成できるかを見るには 'sudo'または' su'ソースを調べることができます。 – Kevin

答えて

1

これを行うための "標準的な"方法は、元々彼のQMailプログラムで使われていた彼の 'setuidgid'コードでD.J.Bernsteinによって実装されました。現在は 'daemontools'に含まれています。

GNUのcoreutilsのに使用される実際のコードは、手順のDJBの説明に基づいており、そのコードをここに表示されているhttps://github.com/wertarbyte/coreutils/blob/master/src/setuidgid.c

+0

ああ、クール。私は先に進んで、この回答を受け入れるつもりですが、私はライセンスのためにそれを直接使用することはできません。 –

+0

リンクが壊れています。 – alexander255

+0

通知ありがとう、ありがとうございました – Jaromil

関連する問題