ntpdの設定

サーバーの設定をする上でsshdの次に大切なものが時刻同期です。

時刻同期の必要性

時刻同期はセキュリティ上で必要なことです。

インターネットは機器が接続されている世界です。攻撃を受けた際、あるいは、踏み台などにされた際にはそれらの痕跡が各機器にログなどとして残ります。実際に事件が起きた際にはそういったログの提出を求められることもあります。その時に時刻が同期されていないとログを辿ることが難しくなってしまいます。

そういった時の備えとして、常にサーバーの時刻は同期しておくようにしましょう。

NTP

一昔前までは正確に時刻を同期する方法が確立されておらず、それぞれの機器はそれぞれで時間を設定していたものです。しかし、今では据置き型の時計は電波時計、携帯電話やスマホはGPSで時刻を同期するようになりました。

そんな中でサーバーには古くから時刻を同期するためのNTP(Network Time Protocol)があります。正確な時刻を提供するサーバーをNTPサーバー。それに合わせて時刻を同期するクライアントをNTPクライアントと呼びます。

NTPサーバーは原子時計や水晶発振子といった正確に時刻を知ることができるデバイスと同期してます。こういったサーバーを特にstratum 1と呼びます(stratum 0は原子時計や水晶発振子などです)。また、DNSにおけるキャッシュサーバーのように、そういったデバイスと同期したNTPサーバーと同期して、ネットワーク内でリファレンスとなる時刻を提供するサーバも存在します。こちらはstratum 2、3、…となります。

さて、VPSでは基本的にはNTPクライアントだけがあればいいのですが、定期的にNTPクライアントを使って時刻を同期するよりも、自分だけが参照できるNTPサーバーを立ち上げて、上位のNTPサーバーにぶら下げる方が一般的です。

NTPサーバー

FreeBSDで使うことができるNTPサーバーには以下があります。

  • ntpd
  • OpenNTPD
  • chrony

OpenNTPDはOpenBSDのプロジェクトが開発したNTPサーバーです。前に紹介したportsから入れることができます。

chronyはLinuxでよく使われているNTPサーバーです。

どれを入れてもいいのですが、FreeBSDにはntpdが標準で入っていますので今回はこれを使うことにします。

ntpdの設定

実はさくらのVPSでFreeBSDサーバーを作成した場合は、既にntpdの設定が行われています(自分の場合はそうでした)。

具体的には /etc/rc.conf に以下の記述があれば有効になっています。

ntpd_enable="YES"

sysrcコマンドでも確認できます。

% sysrc -e ntpd_enable
ntpd_enable="YES"

続いて ntp.conf の中身を確認しましょう。

(省略)
#
# The option `iburst' is used for faster initial synchronization.
#
server ntp1.sakura.ad.jp iburst
(省略)

この server の部分に上位となるNTPサーバーを指定します。日本で公開されているNTPサーバーには以下のようなものがあります。

これ以外にも各VPSサービスやプロバイダーが公開している場合がありますので、サーバーからネットワーク的に近いものを選びましょう。今回はさくらインターネットが公開しているNTPサーバーを指定しました。

ntpdの起動

FreeBSDにおけるサービス(デーモン)の起動スクリプトは /etc/rc.d/XXXX (OS標準の場合)か /usr/local/etc/rc.d/XXXX (portsから入れた場合)にあります。

Linuxでいうところの /etc/init.d に近いと思います。なおLinuxの systemctl に相当するコマンドは service になります。

今回は ntpd を起動するので以下のコマンドを実行します。

% sudo /etc/rc.d/ntpd start
Starting ntpd.

service を使う場合は以下のコマンドになります。

% sudo service ntpd start
Starting ntpd.

また、同期しているかどうかは ntpq コマンドで確認できます。

% ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*2001:e42:0:1:21 43.162.219.88    2 u  344 1024  377   16.745   -0.121   0.183

VPSの場合はないとは思いますが、あまりにサーバーの時刻がNTPサーバーの時刻と離れていて ntpd で同期できない場合があります。そういう場合は ntpdate コマンドを使って、一度手動で時刻を同期してみてください。なお、このコマンドは既に ntpd が起動しているとエラーになります。一度止めてから実行してください。

% sudo /etc/rc.d/ntpd stop
% ntpdate ntp1.sakura.ad.jp
% sudo /etc/rc.d/ntpd start

参考

sshの初期設定

サーバーにログインする際に使うsshに関するお薦めの設定を説明します。

  • rootでログインしない
  • パスワードでログインしない

Linuxに限らずFreeBSDでも管理者はrootです。しかし、rootで直接ログインするのは避けるようにします。AWSやGCPではデフォルトでrootユーザーによるログインは禁止されています。なぜそうするのかというと、一般ユーザーでログインするようにしていれば、万が一セッションを乗っ取られてもサーバーのコントロールが奪われることにはならないからです。

まず最初に作業用のユーザーを作成しましょう。さくらのVPSでFreeBSDをインストールした際にVNCコンソールを使ったと思います。こちらからログインして作業してもいいでしょう。

ユーザーを作成する

adduserコマンドで対話的に作成します。もしもインストーラーでユーザーを作成済であれば、飛ばして構いません。グループにwheel operator networkを追加しているのは理由があります。

  • wheel: suを使うために必要
  • operator: 一般ユーザーでshutdownをするために必要
  • network: 一般ユーザーでネットワーク関連のコマンドを使うのに必要
# adduser
Username: ユーザー名
Full name:(空欄でいい)
Uid (Leave empty for default):
Login group [ユーザー名]:
Login group is ユーザー名. Invite ユーザー名 into other groups? []: wheel operator network(この3つを加えておくといい)
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: tcsh(※Linuxと違い、FreeBSDでbashはデフォルトではありません)
Home directory [/home/ユーザー名]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: パスワードを入力
Enter password again: パスワードを入力
Lock out the account after creation? [no]:
Username   : ユーザー名
Password   : ****
Full Name  : 
Uid        : 1001
Class      :
Groups     : ユーザー名 wheel operator network
Home       : /home/ユーザー名
Shell      : /bin/tcsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (ユーザー名) to the user database.
Add another user? (yes/no): no
Goodbye!
#

bashが使いたい場合はpkgコマンドでbashを追加してください。

# pkg install bash
# echo /usr/local/bin/bash >> /etc/shells
# chsh /usr/local/bin/bash ユーザー名

ssh公開鍵を登録する

パスワードはソーシャルエンジニアリングなどで盗まれるリスクがあります。ssh公開鍵によるログインを使うようにしましょう。

作成したユーザーにパスワードでログインできることを確認したら、次はssh公開鍵を作りましょう。これはFreeBSDサーバーではなく、手元の端末側で行います。既に公開鍵がある場合はそれを使って構いません。

% ssh-keygen -b 384 -t ecdsa

次にssh公開鍵をFreeBSDサーバーに設定します。

% mkdir .ssh
% cat > .ssh/authorized_keys
(ここにssh公開鍵 id_ecdsa.pub の中身をコピペする)
Ctrl-D
% chmod -R go-rwx .ssh

公開鍵でログインできればOKです。

sudoを設定する

一般的にrootになるにはsuコマンドを使いますが、suの問題点はrootのパスワードが必要であることです。先に書いたようにrootのパスワードは使わないに越したことはありません。

そこでsudoを使います。sudosuのように特権(root権限)を得ることができますが、違いはそのユーザーのパスワードを使うという点です。sudoはデフォルトではインストールされていないので、pkgコマンドを使ってインストールします。最初のインストールはrootでないとできないので、rootでログインするかsuを使いましょう。

# pkg install sudo

このままでは作成したユーザーはsudoを使えません。sudoで特権が得られるように設定します。FreeBSDではports(pkgコマンド等でインストールしたパッケージ)は/usr/localにインストールされます。そのため、設定ファイルも/etc/ではなく/usr/local/etcになります。

# cd /usr/local/etc/sudoers.d
# cat > ユーザー名
ユーザー名 ALL=(ALL) ALL
Ctrl-D
# chmod 440 ユーザー名

これで作成したユーザーでsudoできるようになります。whoamiを実行するとrootになっているのが分かります。

% whoami
ユーザー名
% sudo whoami
root

rootログインを無効にする

FreeBSDのデフォルトではrootでsshログインできないようになっています。さくらのVPSでインストールしたFreeBSDではrootでのsshログインが許可されている場合があります。

/etc/ssh/sshd_configを確認しましょう。下記のようにPermitRootLoginがコメントアウトされていれば大丈夫です。yesになっていた場合はコメントアウトしてください。

(省略)
# Authentication:

#LoginGraceTime 2m
#PermitRootLogin no
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
(省略)

ここまでで十分ではありますが、更にセキュリティを強化したい方向けの設定を書いておきます。

sshのポートを変更する

sshはデフォルトではポート22を使います。これは共通であるがために、sshのログインを試みようとする攻撃の対象となりがちです。

パケットフィルターを設定している場合にはポート22へのアクセスを制限しているので必要ないかもしれませんが、「全て許可」にしている場合には別のポートに変えておくことで攻撃の対象にされにくくすることができます。

sshのポート変更は/etc/ssh/sshd_configでもできますが、私は/etc/rc.confによる変更をお薦めします。以下はポート22222に変更する場合です。

% sudo sysrc sshd_flags='-p 22222'
% sudo /etc/rc.d/sshd restart

ところで、/etc/rc.confを編集するためのsysrcなんてコマンドがあるんですね。今回この記事を書くにあたって調べて初めて知りました。(どうやらFreeBSD 9.2で追加されたらしい)

私のような古参はvi/etc/rc.confを編集することしか知らないので、コマンドで編集できると知って新鮮な気持ちになりました。ちなみにviが苦手な人はeeというエディタ(Linuxのnanoみたいなやつ)もあるので、使い易い方をお使いください。

参考

パケットフィルターを設定

さくらのVPSでサーバーを新規作成したら、まずやってもらいたいことがあります。それはパケットフィルターを設定することです。

なぜパケットフィルターが必要か?

インターネット上に作成したサーバーは常に悪意のある第三者から攻撃される危険に晒されています。インストール直後のFreeBSDは、基本的にssh以外のサービスは外部に公開していないとはいえ、ネットワーク上で接続できるという事実は変わりません。

悪意のある第三者は攻撃して乗っ取ることができるターゲットを常に探していますので、たとえIPアドレスやFQDNを公開していなかったとしても攻撃される可能性はあります。その際に、攻撃の対象となるサービスを可能な限り減らしておくことが重要です。

パケットフィルターの設定

一般的なクラウドサービスでは「セキュリティグループ」が導入されています(AzureやAWSなど)。デフォルト拒否、指定したものだけを許可するルールが一般的です。さくらのVPSのパケットフィルターも有効にするとデフォルトは拒否になります(※)。そこで必要なサービスだけを許可に加えていきましょう。

(※厳密にはこちらに記載のあるように、いくつかのポートはデフォルトで許可になっています。)

sshの接続を許可する

まずはsshを追加しましょう。その際にsshの接続元のIPアドレスは可能な限り制限することが望ましいです。そこで「全てのポート」ではなく、自分がログインする接続元のIPアドレスだけの「一部許可」にして限定することをお勧めします。

「接続可能ポートを追加」で一部IPアドレスのみ許可する

なお、パケットフィルターでは全て許可にしておいて、サーバー側(つまりFreeBSD)で許可するIPアドレスを制限する方法もあります。しかし、こうするとIPアドレスが変わったり、設定を間違えた場合にFreeBSDにログインできなくなるリスクが生じます。

さくらのVPSのコントロールパネルは、どんなIPアドレスからでもアクセスできます。そこで、サーバー側ではなくパケットフィルター側でIPアドレスを制限することで、もしも接続元IPアドレスが変わってしまった場合でも変更できるようにしておくのです。

他のサービスの接続を許可する

今後、FreeBSDのサーバーでサービスを公開する(例えばWebとか)際には順次パケットフィルターに接続可能ポートを追加していくことになります。

ただ、現時点では特にサービスは公開していないので追加はしないでおきましょう。

次はいよいよFreeBSDサーバー側での設定を始めます。

参考

puppeteer 13.5.1

puppeteer 13.5.1がリリースされました。

さっそくリリースノートを見ていきましょう。

Bug Fixes

・waitForNavigation in OOPIFs

https://github.com/puppeteer/puppeteer/releases/tag/v13.5.1

今回はバグ修正のみでした。

ところで「OOPIFs」は「out-of-process iframes」の略です。即ちiframeを別のプロセスでレンダリングするという意味です。ご存知の通り、HTMLにはiframeを記述することで別のサイト(ドメイン)のページを表示することができます。

従来よりこれはセキュリティ上の問題となっていました。例えば、親ページで処理されている情報(クッキーだったりJavaScriptのオブジェクトだったり)を、セキュリティホールを突いてiframe側が意図しない方法で抜き出すようなことがありました。こういった問題を事前に回避するた、CORS(オリジン間リソース共有)などで明示的にリソースを共有する・しないを指定するようになったのです。

話を戻すと、HTMLやJavaScriptの世界では確かにデータが漏れないようにしていますが、それを更に強化する方法として考え出されたのがOOPIFsです。そもそもiframeを別の(ブラウザ)プロセスで処理させることで、メモリ空間を分けてしまうという考え方なわけです。

Webセキュリティを第一に考えているGoogleのChromiumならではの機能でした。そのうちChromeにも降りてくるんじゃないかと思います。

FreeBSDをインストール

実は「さくらのVPS」で最初から選べるOS(標準OS)にFreeBSDはありません。そのため、「OS再インストール」によってFreeBSDをインストールすることになります。具体的には以下の手順になります。

  1. コントロールパネルの「新規作成」から適当なOS(※)を選んでサーバーを作成する。
    ※とりあえずCentOS 7あたりを選ぶとよいです。
  2. 「OS再インストール」から「カスタムOS」を選択して「FreeBSD 12」か「FreeBSD 13」を選ぶ。
  3. さくらのVPSマニュアルに従ってインストールを行う。
    マニュアルの画面はFreeBSD 11ですが、FreeBSD 12/FreeBSD 13でも同じなので安心です。

以上で終わりです。実はさくらのVPSマニュアルがかなり丁寧に解説しているので、この画面の通りの操作でほぼ問題ありません。強いて言うならばセットアップで作業用のユーザを作っておいた方がいいですが、後から作っても問題ありません。

管理ユーザ(root)のパスワードは覚えておく

最初に選ぶ「標準OS」で設定した管理ユーザ(root)のパスワードは一応覚えておいてください。FreeBSDのrootパスワードはインストーラーの中で再設定するのですが、実はコントロールパネルにIPアドレスでログインする際には最初の「標準OS」の時に設定したパスワードを使います。もしも忘れた場合はコントロールパネルで再設定できますのでご安心を。

FreeBSDのバージョンリリース

2022/3/10現在のFreeBSDの各バージョンリリースとEOL(End of Life)は以下です。

ブランチ/リリースリリース日EOL日
stable/132026/1/31
13.1-RELEASE(2022/4予定)(13.2-RELEASEの3ヶ月後)
13.0-RELEASE2021/4/1313.1-RELEASEの3ヶ月後
stable/122024/6/30
12.3-RELEASE2021/12/712.4-RELEASEの3ヶ月後
12.2-RELEASE2020/10/272022/3/31
https://www.freebsd.org/security/#sup

FreeBSDも他のオープンソースソフトウェアと同じく「メジャー.マイナー」というバージョンナンバリングを採用しています。特にメジャーバージョンを取って12系とか13系と言います。番号が新しい方(13)が最新版のメジャーバージョン系列で、もう片方(12)が安定版のメジャーバージョン系列になります。CentOSにおける7系と8系(8系はなくなってしまいましたが…)の関係に近いと考えてもらうとよいです。

FreeBSD 12にするか13にするか

安定版系列(12系)は先にサポート終了になるので、基本的には最新版系列(13系)を選んだ方がよいです。しかし、FreeBSDには最初の最新版メジャーバージョン(つまりX.0)は避けた方がよい、というジンクスもあったりします。最近はないですが、私は昔は最初のリリースで地雷を踏んだことがよくありました。現時点では13系のリリースは13.0なので個人的には避けたいところです。13.1がリリースされれば、13.1を選んで問題ないでしょう。12系を選ぶ場合は最新の12.3を選べば問題ありません。新規インストールの場合に古いリリースを選ぶ必要はありません。

FreeBSDのメジャーバージョンアップ

ちなみに、FreeBSDでは12系から13系に上げるメジャーバージョンアップ作業(※)はそれほど大変ではありません。そのため今は12系を選んでおいて、後でサポート終了が近くなってから13系に上げても問題ありません。

(※12→13が大変ではないだけで、バージョン間によっては大きな変更があって大変になる場合があります。コンパイラがgccからclangに変わった時やia32からamd64に変わった時はかなり大変でした。)

既に廃止してしまいましたが、旧 www.magisystem.net の自宅サーバは 4.4-RELEASEから12.3-RELEASEまで実に8回ものメジャーバージョンアップを乗り越えてきました。初めてだと心配なこともありますが、最近のFreeBSDにはfreebsd-upgradeコマンドがあって慣れると簡単にできます。また、メジャーアップグレードしやすいように環境を保つことでも作業負荷を低減できます。

このあたりのノウハウも後々書いていこうと思います。

参考