1 ポイント 投稿者 GN⁺ 2024-04-28 | 1件のコメント | WhatsAppで共有
  • BSDデスクトップやchroot、jailをよく使うユーザーが Alpine Linux を試し、セキュリティ・シンプルさ・リソース効率を重視した設計がBSDユーザーにとってなじみやすいと見ている
  • 小さなサイズと限定的な依存関係のおかげで、Alpineは コンテナのベースイメージ だけでなく、組み込みシステム、ルーター、モバイル機器、サーバー、デスクトップまで幅広く使われている
  • インストールはライブ環境で setup-alpine を実行し、キーマップ、ネットワーク、タイムゾーン、SSH、NTPなどの 基本設定 を順に行う方式
  • 初回起動後には OpenRCmusl、busyboxの組み合わせが見え、/etc/rc.confcrond(8) などの要素がBSD式rcの体験と通じている
  • apk によるパッケージ管理、リポジトリ設定、ZFSインストールの可能性まで確認したうえで、テスト用およびサーバー用の メインLinuxディストリビューション候補 として真剣に検討するほど好印象を受けた

BSDユーザーになじみやすいAlpineの性格

  • Alpine Linuxは、セキュリティ、シンプルさ、リソース効率を重視するパワーユーザー向けの 独立・非商用・汎用Linuxディストリビューション
  • ユーザー空間のバイナリは PIE(Position Independent Executables) とstack smashing protection付きでコンパイルされており、特定のゼロデイや脆弱性悪用を減らすことに重点を置いている
  • Natanael Copaが2005年にプロジェクトの起源について議論していたほど、Alpineは予想以上に歴史のあるプロジェクト
  • BSD系と同様に、組み込みシステム、ルーター、モバイル機器だけでなく、一般的なサーバーやデスクトップでも使われている
  • 小さなサイズと限定的な依存関係のため、Linuxコンテナの ベースイメージ として広く使われており、chroot(8) で簡単に実行するための alpine-chroot-install のようなツールもある
    • NetBSDの chroot(8) やFreeBSD jailをテストとデプロイに多用するユーザーにとって、特に興味深い点

インストール体験

  • AlpineはARM、PPC64、x86、x86_64など複数のビルドを提供している
  • Xen ISOイメージをVMで起動したが、Dom0をDomUと読み違えた選択だった
    • Dom0はXenハイパーバイザーを指し、ゲストではない
    • それでも標準ISOのように起動とインストールは進んだ
  • インストールはライブ環境で root と空のパスワードでログインした後、setup-alpine を実行する方式
  • インストール中は キーマップ、ネットワーク、タイムゾーン、root認証などの基本項目を順番に設定する
  • 開始段階でSSHキーを注入できる
    • その後、オーケストレーションツールでVMやサーバー群をデプロイする際に有用
    • OOBコンソールを提供しないホスティング環境でも役立つ
  • SSHサーバーとNTPクライアントを選択でき、OpenSSHとopenntpdを選べた
  • インストール過程では、Xen上で動作中であることを正しく検出した
  • LVM設定も可能だが、今回はAlpineが sys パーティションと呼ぶ標準構成を選択した
    • この構成は ext4 を使う

初回起動後に見えるシステム構成

  • 初回起動後、dmesg(1) でシステムが OpenRC を使用中であることを確認できる
  • OpenRCは、移植性、小さなサイズ、高速性、効率、透明性、セキュリティを備えたinitシステム
  • BSD式rcスクリプトの作成に慣れているユーザーにとって、OpenRCは非常になじみ深い
    • /etc/rc.confcrond(8) などの要素がBSDユーザー体験と通じている
  • Devuan、Gentoo、AlpineのようにOpenRCを使うLinuxディストリビューションがあり、Linuxが再び面白く感じられる
  • AlpineはOpenRCとともに musl を含み、busyboxを使用する
    • muslとbusyboxはGCCやGNU coreutilsより制限があるが、ベースシステムの 小さなサイズ と攻撃対象領域の縮小に貢献している
  • llvmも利用できる
  • MirBSD Korn shellもパッケージとして提供されており、好みの対話型シェルの一つ

パッケージ管理とリポジトリ

  • Alpineの標準パッケージマネージャーは apk
  • Linuxで一般的な方式と同じく、apk はベースシステムとパッケージを区別せず、まとめて更新する
  • BSDのように権限のないコピーとして実行できるかは、まだ確認していない
  • pkgsrcも利用できるため、代替手段は残っている
  • リポジトリ設定は /etc/apk/repositories にある
    • インストーラーが提示した2つ目のURLのコメントを解除すると、communityリポジトリ を有効化できる
    • Alpineには testing リポジトリもあり、独自リポジトリも追加可能
  • 使い方はシンプルだが、これまでの習慣で apk add の代わりに apt install と誤入力してしまうこともある
  • 公式パッケージWebインターフェイスは pkgs.alpinelinux.org にある
  • Alpineのリポジトリは pkgs.org でも確認できる

ZFSとサーバー用候補としての評価

  • いくつかのパッケージをインストールした後、コンソール専用ノートPCで使っていた「必須ツール」構成をそろえることができた
  • 最も驚いたパッケージの一つは ZFS だった
    • インストールとカーネルモジュールのロードは2つのコマンドで可能だった
# apk add zfs zfs-lts


# modprobe zfs
  • rootファイルシステムをZFSで構成する作業は、より複雑になる可能性がある
  • アップグレード後にZFS構成がどう動作するかは、まだ確認していない
  • これまでの経験だけでも、テスト用およびサーバー用のメインLinuxディストリビューションとして 移行を真剣に検討 するほど印象は良い
  • htop(1)lsof(1) で認識できる少数のプロセスしか見えない点、OpenRCの使用、シンプルに見えるパッケージ管理、容易な設定が利点として挙げられる
  • モダンで機能的な「Occam’s Linux」があるとすれば、Alpineはそれに近い姿だと評価している
  • busyboxより多くの機能が必要な場合は uutils を実行してみることもできるが、サーバーでは必要性は低そうだ

1件のコメント

 
GN⁺ 2024-04-28
Hacker News の意見
  • セキュリティの観点で見ると、最近の Linux バイナリはほとんど PIE でコンパイルされている
    Ubuntu の任意のバイナリに checksec を実行してみるとそうした属性が表示されるし、pip install pwntoolschecksec をインストールできる
    一方で GLIBC は、私の知る限り最も堅牢化されたヒープ実装を持っており、二重解放やその他のヒープ攻撃に対する緩和策もより多い
    なのでその面では、Alpine は musl を使っているため安全性が低いと見なせるが、小さく理解しやすいシステムであることはセキュリティ上、本当に大きな利点だ

    • 「小さく理解しやすいシステム」がなぜ glibc に有利な根拠になるのかよく分からない。むしろ逆ではないかと思う
    • Alpine ノードではいつもあらゆるものに checksec を実行しているが、プロセスはすべてこんな感じで表示される。出力全体は長いので省略するが、Alpine がビルドしたものでこれらのフラグが抜けているものは見たことがない
      COMMAND PID RELRO STACK CANARY NX/PaX PIE
      init 1 Full RELRO Canary found NX enabled PIE enabled
      [snip...]
      crond 422838 Full RELRO Canary found NX enabled PIE enabled
    • OpenBSD libc も確認してみる価値がある
    • Linux のセキュリティの観点では、誰かがシステム上で少しでもコードを実行できるなら、もう終わりだと思う。Linux は穴だらけで、Windows ほどマルウェアであふれていない理由は、デスクトップで Linux を使う人が少なく、マルウェア作者が大きな標的にしていないからだ
      正直なところ、現代の Windows と macOS のほうがどちらもより優れた セキュリティアーキテクチャを持っていると思う
  • 私も BSD 寄りの人間で、偶然にも今週、bhyve 上の VM で Alpine を初めて動かしてみた
    重要なのは BusyBox だ。/bin/sbin のユーティリティがそれぞれ独立したバイナリである必要がなければ、ユーザー空間は非常に小さく、起動も速い。Tmux と zsh くらいを入れたら、たいていの Unix 用途には十分だった
    最終的な環境にするまでには apk でかなり多くインストールすることになったが、全体としては久しぶりに味わった最高の Linux 体験だった。ZFS が標準で入っていて、bhyve の ZFS ベースの実行に合わせた virtio 接続がもっと明示的だとよいと思う

    • FreeBSD を20年以上使い、配布してきたが、GNU/Linux のマシンにログインするのは正直気が進まない。派生や不整合が多すぎて、システムがめちゃくちゃに感じる。Windows サーバーにログインするほうが、むしろ「筋が通っている」と感じるほどだ
      それでも正気な Linux ディストリビューションがあるかもしれないと聞けるのはうれしいし、Linux マシンが必要になったら一度試してみるつもりだ。ただ、そういう機会はかなりまれだ
    • ZFS がどの程度まで「標準搭載」されていてほしいのか気になる。Alpine は バイナリ ZFS カーネルモジュールを提供している数少ないディストリビューションの一つなので、apk コマンド一発でほぼインストールできる
      Alpine Wiki には、ルートファイルシステムを ZFS にしてインストールするための文書もかなりよくまとまっている: https://wiki.alpinelinux.org/wiki/Root_on_ZFS_with_native_en...
    • ZFS は Alpine で非常によく動作する。Alpine + ZFS はここ数年、私の標準サーバー構成だ
  • BSD ユーザーなら Void Linux も気に入るかもしれない。NetBSD 開発者の xtraeme が作ったディストリビューションで、glibc 版と musl 版があり、init システムには runit を使っている
    xbps-src でソースからパッケージをビルドすることもできる
    https://voidlinux.org/

    • Arch を使っていたが、Arch に近い感触の 非 SystemD 代替を探した末に Void に落ち着いた。Alpine ではなく Void にした理由は、glibc サポートのおかげで NVidia ドライバを使えたからだ。もちろん「NVidia へのブーイング」は承知している
    • Void をとても気に入っている。豊富なパッケージの選択肢と systemd の利便性のためメインシステムは Arch だが、親戚のマシンと自分の機材3台に Void を入れてみて、素晴らしかった
      ただし、最小限の変更だけを加えた xfce インストールしか使っていない点には注意が必要だ。複雑なマルチユーザー構成では、runit は systemd より標準搭載の機能が少ないため、少し面倒になるかもしれない
    • 数年前は voidlinux+musl で Rust を使う際に問題があった。幸い Void は glibc で簡単に再インストールできる
    • Chimera も良いかもしれない。中核ツールのユーザー空間の多くが FreeBSD 系なので、BSD ユーザーにはかなりなじみやすそうだ
    • CRUX もある。Archlinux の元祖のようなディストリビューションだ
  • BSD たちが誇る man ページが Alpine には標準で含まれていない、という話が出ると思っていた。それが旅行用ノートPCで Alpine を使わなくなった理由の一つで、今は OpenBSD を使っている
    Alpine でパッケージを入れるとき、ドキュメントが常にインストールされるようにする設定オプションを私が見落としているのだろうか? それとも毎回 -doc パッケージを手動でインストールするしかないのか?

    • ドキュメントを常に欲しいなら、docs メタパッケージをインストールすればよい。以後インストールする項目に対応する *-doc パッケージを引っ張ってきてくれる
    • ノートPCで OpenBSD を使う場合、ハードウェアサポートはどうなのか?
  • 人々がなぜ OpenRC のようなものを魅力的だと感じるのか、正直まったく分からない。監視ベースの方式なら何であれ、PID を吐き出して PID ファイルに保存し、3週間後にもその値がまだ起動したデーモンを指していることを願う方式よりは良いと思う
    しかも場合によっては、特定のプロセス名を pgrep してサービス管理作業を処理することもある。すべてをデフォルトで自動再起動すべきではないという考えにはある程度同意するが、この手のものが掲げられる長所は実質的にそれだけだ
    また結局、こうしたものは syslog に大きく依存しているが、これはまさに80年代の技術そのものだ。multilogsvlogd のようなツールは、複数のツールで起きた出来事の順序を一目で見られる中央ビューをより簡単に提供できるよう改善できるかもしれないが、曖昧なカテゴリでログをまとめ、誰でも任意の名前でどこにでもログを残せるようにする機能は奇妙に感じる

    • ちなみに Alpine は何年も前から OpenRC の代替を試みてきたが、適切な代替案を見つけられていない。初期化システムに依存しないディストリビューションになろうとする試みもある
      https://mastodon.social/@ariadne@treehouse.systems/112044942...
      https://mastodon.social/@ariadne@treehouse.systems/112214386...
    • とはいえ主な代替案は systemd だが、あれは安全ではない形で設計されており、新しく興味深い CVE が生まれ続ける余地を残している
      PID1 の中にあまりに多くの処理が入っており、メモリ安全ではない言語で書かれている。最小限の PID1 といくつかの setuid プログラムに分けられない技術的理由は見当たらない
      Docker コンテナ内で systemd を動かせるようになる点以外には思いつかないが、Red Hat/IBM は systemd-nspawn のような自社のコンテナ化ツールを使ってほしいはずなので、それを強く望んでいるとは思えない。今の構造では、セキュリティの観点から到底妥当にはなり得ないと思う
  • Alpine には面白い利点がある。Nix ユーザーが 宣言的パッケージ管理を自慢するとき、/etc/apk/world を直接編集して apk fix を実行し、Nix なしでもどうやるかを見せられる

    • たいていは Gentoo 方式の方が良い。手動インストールしたパッケージは /var/lib/portage/world、選択した集合は /var/lib/portage/world_sets、集合定義は /etc/portage/sets/ に置ける
      こうすればパッケージをカテゴリ別に分け、必要なシステムにだけ一部をインストールし、ファイルにコメントも好きなように追加できる。apk fix に相当するのは emerge -uDU @world && emerge -c だが、少し面倒ではある
      Alpine でも apk add -t setname pkg1 pkg2 pkg3 で集合に似たものを作れるし、そうすると選択したパッケージに依存するダミーパッケージが作られる。私はたいてい Gentoo っぽさをまねようとして /etc/apk/sets/ にシェルスクリプトを作るが、いつも同じではない
    • Nix が自分のシステム flake を評価するのにかかる時間があれば、Alpine を最初から再インストールできる
    • かっこいいことではあるが、Nix/OS は宣言的なパッケージインストールよりはるかに多くのことをしている
  • 以前 Docker で Alpine を動かす際の性能に関する記事があり、Debian/Ubuntu を使うよう勧めていた記憶がある
    遅い Alpine に関する記事:
    https://pythonspeed.com/articles/alpine-docker-python/
    https://superuser.com/questions/1219609/why-is-the-alpine-do...
    Alpine に好意的な記事:
    https://nickjanetakis.com/blog/benchmarking-debian-vs-alpine...
    この話が今でも有効なのか気になる

    • 具体的な不満のかなりの部分は、少なくとも解決済みだ。最初のリンクの一番下でも認めているように、Alpine 互換の Python wheel は今では存在し、DNS 問題もかなり前に修正された
      それでも性能面でベンチマークを回して実際の数字を見るのは興味深そうだ
  • musl はまだ pthread_attr_setaffinity_np をサポートしていないのでは? そうだとすると一部のソフトウェアは実行できず、最大の例が PyTorch

    • 性能に敏感なワークロードがその性能のために glibc に依存しているなら、そのアプリケーションだけコンテナで「そのまま」動かせばよさそうだ
      多くの状況では、性能よりも単純さやセキュリティの方が重要な関心事だ
  • BSD と Linux の間で私が見つけたちょうどよい中間地点は Slackware だ。堂々と Unix らしく複雑でなく、Slackbuilds を通じた豊富な独自 ports ツリーもある

    • Slackware はデスクトップディストリビューションと競おうとしたが、きちんとコミットしないまま方向性を見失った
      以前は邪魔をしない最小限のディストリビューションとして気に入っていたし、少し技術寄りの人たちを対象にしていると見ていた
      ところが問題を掘り下げるとき、フルインストールしていないという理由でコミュニティが敵対的に振る舞うことがあった。フルインストールが推奨方式だというのが理由で、そうしないと samba がないために mplayer が動かないといった馬鹿げた依存関係の問題も起きた
      Alpine はあらゆる面で Slackware より改善されていると思う
    • Slackware を使う人は尊重するが、依存関係管理の欠如は面倒そうに見える
  • Alpine Linux は実は GNU/Linux ではなかったのか。知らなかった
    では BusyBox/Linux なのか?

    • 単に Alpine Linux と呼べばいい。私の知る限り BusyBox は、RMS から時々漏れ出す自己顕示的な振る舞いとは関係がないので問題ない