Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 1156] ファイルの概要

このコミットは、Go言語のデバッガ(cov, profなど)のビルドプロセスに、setgidビットを設定してprocmodグループに属するようにインストールするステップを追加するものです。特にmacOS (Darwin) 環境において、setgidビットが/Usersディレクトリ以下では無視されるというOSの特性に対応するため、デバッガを/usr/local/binにインストールするように変更されています。これにより、デバッガがプロセス関連の操作を行うために必要な権限を適切に取得できるようになります。

コミット

commit 6b7dd4c0207f92b1398f3a1f3436424c182501e0
Author: Russ Cox <rsc@golang.org>
Date:   Tue Nov 18 10:08:46 2008 -0800

    add build step to install debuggers setgid procmod.
    they have to go in /usr/local/bin
    because the setgid bit is ignored in /Users.
    
    R=r
    DELTA=54  (49 added, 0 deleted, 5 changed)
    OCL=19424
    CL=19463

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/6b7dd4c0207f92b1398f3a1f3436424c182501e0

元コミット内容

デバッガをsetgid procmodでインストールするためのビルドステップを追加。 /Usersディレクトリではsetgidビットが無視されるため、デバッガは/usr/local/binに配置する必要がある。

変更の背景

この変更の背景には、デバッガがシステム上の他のプロセスを検査・操作するために必要な特殊な権限の管理があります。Unix系システムでは、通常のユーザー権限では他のユーザーのプロセスや、特定のシステムプロセスにアクセスすることは制限されています。デバッガのようなツールは、これらの制限を越えて動作するために、より高い権限を必要とします。

具体的には、Go言語のデバッガがmacOS (Darwin) 環境で正しく機能するためには、setgidビットが設定され、かつ特定のグループ(procmod)に属している必要がありました。しかし、macOSのセキュリティポリシーにより、ユーザーのホームディレクトリ(/Users以下)に配置された実行ファイルに対してはsetgidビットがセキュリティ上の理由から無視されるという制約がありました。

この制約を回避し、デバッガが期待通りに動作するようにするためには、setgidビットが有効に機能するシステム上の別の場所、具体的には/usr/local/binのような標準的なシステムバイナリのパスにデバッガをインストールする必要がありました。このコミットは、そのためのビルドプロセスとインストールスクリプトを導入することで、デバッガの機能性とセキュリティ要件を両立させることを目的としています。

前提知識の解説

1. setgidビット (Set Group ID)

Unix系ファイルシステムにおける特殊なパーミッションビットの一つです。実行ファイルにsetgidビットが設定されている場合、そのプログラムは実行したユーザーのグループIDではなく、ファイルの所有グループのIDで実行されます。これにより、プログラムは通常のユーザーではアクセスできないリソース(例えば、特定のグループのみが読み書きできるファイルやディレクトリ)にアクセスできるようになります。デバッガの場合、procmodグループの権限で実行されることで、他のプロセスに関する情報にアクセスできるようになります。

2. procmodグループ

macOSなどの一部のUnix系システムに存在する特殊なグループです。このグループに属するユーザーや、setgidビットが設定されこのグループが所有するプログラムは、システム上のプロセスに関する情報(例えば、実行中のプロセスのメモリ、レジスタ、状態など)にアクセスしたり、プロセスを制御したりする権限を持ちます。デバッガが他のプロセスをアタッチしたり、その状態を読み取ったりするためには、このprocmodグループの権限が必要となります。

3. /usr/local/bin

Unix系システムにおける標準的なディレクトリの一つで、ローカルにインストールされた実行可能ファイルが配置される場所です。システム全体で利用可能なコマンドやプログラムが置かれます。/Users以下のユーザーディレクトリとは異なり、/usr/local/binに配置された実行ファイルは、setgidビットが正しく機能することが期待されます。

4. Makefile

makeコマンドによって実行されるビルド自動化ツールで使用される設定ファイルです。ソースコードのコンパイル、リンク、インストールなどの手順を記述します。このコミットでは、installターゲットの動作をOSごとに分岐させるために変更されています。

5. unameコマンド

Unix系システムで、現在のシステム情報を表示するコマンドです。特にunameの出力は、OSの種類(例: Linux, Darwin for macOS)を判別するためにシェルスクリプトでよく利用されます。

6. sudoコマンド

"superuser do"の略で、通常のユーザーが一時的にスーパーユーザー(root)や他のユーザーの権限でコマンドを実行するためのコマンドです。システムファイルをコピーしたり、パーミッションを変更したりする際に必要となります。

技術的詳細

このコミットは、Go言語のビルドシステムに、デバッガのインストールに関するOS固有のロジックを導入しています。

  1. Makefileの変更:

    • src/cmd/cov/Makefilesrc/cmd/prof/Makefileにおいて、installターゲットがinstall-$(GOOS)に依存するように変更されました。$(GOOS)はGoのビルドシステムが提供する環境変数で、現在のオペレーティングシステム(例: linux, darwin)を示します。
    • これにより、make installが実行された際に、OSに応じてinstall-linuxまたはinstall-darwinのような特定のターゲットが呼び出されるようになります。
    • install-linuxinstall-defaultにフォールバックし、これは単にビルドされたデバッガのバイナリを$(BIN)ディレクトリ(通常は$GOROOT/bin)にコピーします。
    • install-darwinターゲットは、@trueという空のコマンドを実行するだけです。これは、macOSでの実際のインストールと権限設定が、後述のsudo.bashスクリプトによって行われるためです。Makefileのコメントで「on Darwin, have to install and setgid; see $GOROOT/src/sudo.bash」と明記されており、この役割分担が示されています。
  2. src/make.bashの変更:

    • Goのビルドスクリプトであるsrc/make.bashに、unameコマンドの出力に基づいてOSを判別するcase文が追加されました。
    • もしOSがDarwin(macOS)である場合、ビルドの最後に「%%% run sudo.bash to install debuggers」というメッセージが表示されるようになりました。これは、ユーザーに対してデバッガの適切なインストールと権限設定のためにsudo.bashスクリプトを手動で実行する必要があることを促すものです。
  3. src/sudo.bashの新規追加:

    • このスクリプトは、macOS環境でのデバッガの特殊なインストール手順を自動化するために作成されました。
    • スクリプトはまずunameDarwinであるかを確認し、そうでなければ即座に終了します。
    • acid, db, prof, covといったデバッガのリストをループ処理します。
    • 各デバッガについて、以下のsudoコマンドを実行します。
      • sudo cp $GOROOT/src/cmd/$i/6$i /usr/local/bin/6$i: ビルドされたデバッガのバイナリ(例: 6acid)を$GOROOT/src/cmd/$i/から/usr/local/bin/にコピーします。6プレフィックスは、当時のGoのツールチェインにおけるバイナリの命名規則(例: 6g for Go compiler for 64-bit systems)に由来します。
      • sudo chgrp procmod /usr/local/bin/6$i: コピーしたデバッガのファイルのグループ所有者をprocmodグループに変更します。
      • sudo chmod g+s /usr/local/bin/6$i: コピーしたデバッガのファイルにsetgidビットを設定します。これにより、このデバッガがprocmodグループの権限で実行されるようになります。

これらの変更により、macOSユーザーはGoのデバッガをインストールする際に、setgidビットが正しく機能し、procmodグループの権限で実行されるように設定するための明確な指示と自動化されたスクリプトを利用できるようになりました。

コアとなるコードの変更箇所

  • src/cmd/cov/Makefile: installターゲットの変更とinstall-darwininstall-defaultターゲットの追加。
  • src/cmd/prof/Makefile: src/cmd/cov/Makefileと同様の変更。
  • src/make.bash: macOS環境でsudo.bashの実行を促すメッセージの追加。
  • src/sudo.bash: setgid procmodでデバッガを/usr/local/binにインストールするための新規シェルスクリプト。

コアとなるコードの解説

src/cmd/cov/Makefile および src/cmd/prof/Makefile の変更

--- a/src/cmd/cov/Makefile
+++ b/src/cmd/cov/Makefile
@@ -22,7 +22,14 @@ $(TARG): $(OFILES)
 clean:
 	rm -f $(OFILES) $(TARG)
 
-install: $(TARG)
+install: install-$(GOOS)
+install-linux: install-default
+
+# on Darwin, have to install and setgid; see $GOROOT/src/sudo.bash
+install-darwin: $(TARG)
+	@true
+
+install-default: $(TARG)
 	cp $(TARG) $(BIN)/$(TARG)
 
 $(OFILES): $(HFILES)

この変更は、make installコマンドの動作をOSに依存させるためのものです。

  • install: install-$(GOOS): installターゲットが、現在のOS(GOOS変数)に応じたターゲット(例: install-linuxinstall-darwin)を呼び出すようにします。
  • install-linux: install-default: Linux環境では、一般的なインストール手順であるinstall-defaultを実行します。
  • install-darwin: $(TARG): macOS環境では、デバッガのバイナリがビルドされたことを確認するだけで、実際のファイルコピーや権限設定は行いません。これは、後述のsudo.bashスクリプトがその役割を担うためです。@trueは、コマンドが何もしないことを示し、エラーを発生させずに成功を返します。
  • install-default: $(TARG): デフォルトのインストール手順で、ビルドされたターゲットバイナリ($(TARG))を$(BIN)ディレクトリにコピーします。

src/make.bash の変更

--- a/src/make.bash
+++ b/src/make.bash
@@ -28,3 +28,9 @@ do
 	cd ..
 done
 
+case "`uname`" in
+Darwin)
+	echo;
+	echo %%% run sudo.bash to install debuggers
+	echo
+esac

この変更は、Goのビルドプロセスが完了した際に、macOSユーザーに対して追加のステップが必要であることを通知するためのものです。

  • case "uname" in Darwin): unameコマンドの出力がDarwin(macOS)である場合にのみ、以下のブロックが実行されます。
  • echo %%% run sudo.bash to install debuggers: デバッガを適切にインストールするためにsudo.bashスクリプトを実行する必要があることをユーザーに促すメッセージを表示します。

src/sudo.bash の新規追加

--- /dev/null
+++ b/src/sudo.bash
@@ -0,0 +1,18 @@
+#!/bin/bash
+# Copyright 2009 The Go Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+case "`uname`" in
+Darwin)
+	;;
+*)
+	exit 0
+esac
+
+for i in acid db prof cov
+do
+	sudo cp $GOROOT/src/cmd/$i/6$i /usr/local/bin/6$i
+	sudo chgrp procmod /usr/local/bin/6$i
+	sudo chmod g+s /usr/local/bin/6$i
+done

このスクリプトは、macOS環境でデバッガをsetgid procmodでインストールするための中心的なロジックを含んでいます。

  • #!/bin/bash: Bashスクリプトであることを示します。
  • case "uname" in Darwin): 再度、OSがDarwinであるかを確認します。そうでなければスクリプトは終了します。
  • for i in acid db prof cov: acid, db, prof, covというデバッガのリストをループ処理します。これらはGoの初期のデバッガツールです。
  • sudo cp $GOROOT/src/cmd/$i/6$i /usr/local/bin/6$i: 各デバッガのバイナリを$GOROOT内のビルド元から/usr/local/binにコピーします。sudoを使用しているため、管理者権限が必要です。
  • sudo chgrp procmod /usr/local/bin/6$i: コピーしたファイルのグループ所有者をprocmodに変更します。
  • sudo chmod g+s /usr/local/bin/6$i: コピーしたファイルにsetgidビットを設定します。これにより、デバッガがprocmodグループの権限で実行されるようになり、プロセス関連の操作が可能になります。

これらの変更は、Go言語のデバッガがmacOS上で正しく機能するための、OS固有の権限管理とインストールパスの問題を解決するために不可欠でした。

関連リンク

参考にした情報源リンク

  • macOSにおけるsetgidの挙動に関する情報(一般的なUnix/macOSのセキュリティモデル)
  • procmodグループに関する情報(macOSのシステムグループ)
  • Makefileの条件分岐に関する情報
  • unameコマンドの利用方法
  • sudo, cp, chgrp, chmodコマンドの利用方法
  • Go言語の初期のビルドシステムに関する議論(当時のメーリングリストやIssueトラッカーなど、公開されている情報源)