3

低い番号のポート(<1024)でリッスンしているデーモンとして実行したいスクリプトがあります

スクリプトはPythonですが、perlでの回答も受け入れられます。

スクリプトは起動スクリプトでstart-stop-daemonを使用してデーモン化されているため、回答が複雑になる可能性があります

私が本当に(考えて)望んでいないのは、ps -fewと入力して、このプロセスがその行に「ルート」を付けて実行されていることを確認することです。

どうすればいいのですか?

(システムコールについて十分に教育されていないという観点から、私は3つの道を見ることができます。

  1. スクリプトをrootとして実行し(--user /-group /-chuid to start-stop-daemonなし)、ポートを要求した後、ユーザーのエスカレーションを解除します
  2. スクリプトのrootを設定し(chmod u + s)、実行中のユーザーとしてスクリプトを実行します(--user /-group /-chuidを介してstart-stop-daemonを実行しますが、起動スクリプトは引き続き次のように呼び出す必要があります。 root)、スクリプトで、root権限を取得し、ポートを要求してから、通常のユーザーに戻します
  3. 私が知らない何か他のもの

)。

4

4 に答える 4

2

「あなたが知らないこと」は「機能」ですが、他の場所で述べたように、機能はshebangメソッドを使用するスクリプトではうまく機能しないため、ここではあまり答えになりません。「ポートをバインドしてから特権を削除する」方法を使用します。

于 2010-04-04T12:27:24.600 に答える
2

このページには、私をそこに導くコードがいくつかありました。http://antonym.org/2005/12/dropping-privileges-in-python.html

仕事を完了するにはumaskの設定が必要だと思います。それが、このコードが実行しているように見える唯一のことであり、私の試みはそうではありませんでした(プロセスに適用するというコンテキストで、umaskが実際に何を設定するのかわかりません)

私は彼の例を少し引き裂きました。さらに、そのページは 2005 年のものなので、ここに私の作業ソリューションを再投稿します。

def drop_privileges(uid_name='nobody', gid_name='nogroup'):
    # Get the uid/gid from the name
    running_uid = pwd.getpwnam(uid_name)[2]
    running_gid = grp.getgrnam(gid_name)[2]

    # Try setting the new uid/gid
    try:
        os.setgid(running_gid)
    except OSError, e:
        logging.error('Could not set effective group id: %s' % e)
        exit()

    try:
        os.setuid(running_uid)
    except OSError, e:
        logging.error('Could not set effective user id: %s' % e)
        exit()

    # Ensure a very convervative umask
    new_umask = 077
    old_umask = os.umask(new_umask)
    logging.info('drop_privileges: Old umask: %s, new umask: %s' % \
             (oct(old_umask), oct(new_umask)))

    final_uid = os.getuid()
    final_gid = os.getgid()
    logging.info('drop_privileges: running as %s/%s' % \
             (pwd.getpwuid(final_uid)[0],
              grp.getgrgid(final_gid)[0]))    
于 2010-04-04T13:44:21.190 に答える
1

オプション1は、Apachehttpdがたどるルートです。そして、それが世界で最も人気のあるWebサーバーにとって十分である場合、それは自分のデーモンについて真剣に検討する価値があります。

于 2010-04-04T12:22:54.847 に答える
0

LD_PRELOAD-edの場合、実行可能ファイル(スクリプトまたはその他)のroot権限を偽造するライブラリをインストールできます:http: //fakeroot.alioth.debian.org/

スクリプトにスティッキービットのアクセス許可を設定しても(少なくとも私の経験では)効果はありません。ELFバイナリインタープリター(/ usr / bin / python、/ bin / sh、/ usr / bin / perlなど)が機能するためにスティッキーパーミッションが必要です。バイナリを別の場所にコピーし、スティッキービットを設定してから、スクリプトのバングラインをその場所に向けることができます。

ただし、実行しているシステムにrootアクセス権がない場合は、ルーター設定を変更して、<1024外部ポートを>=1024内部ポートに転送できる場合があります。

編集:私はこの小さなツールに言及するのを忘れました:redir。これはローカルポートリダイレクションサービスです。inetdにも対応しています。

于 2010-04-04T12:30:47.370 に答える