- 追加された行はこの色です。
- 削除された行はこの色です。
- Setup-3 へ行く。
&size(24){基本的な設定作業(3)};
#contents
#hr
*いろいろなサービス(デーモン)
linux のシステム上では仮想的に多数の作業が同時に並行して実行できるようになっている。それぞれの実行単位はプロセスと呼ばれている。ps というコマンドを使うと実行中のプロセスを表示させることができる。例えば
$ ps -ef | more
あるいは
$ ps aux | more
のように入力すると、自分が起動した以外のものも含めて現在実行中のプロセスの一覧が表示される。gnome-terminal のように作業中の内容に直接関係すると思われるプロセスの他にも、かなりの数のプロセスが動いていることがわかるだろう。
最初の方に表示される root のアカウントで動いているプロセスは、システムの起動時に自動的に起動されたものが多いだろうと思われる。
また、最後の方にでてくる左端の欄が自分のログインアカウントになっているものは、大部分がおそらくはコンソールにログインした際に起動されたもので、いろいろな入出力の処理などの作業をしているものだと思われる。
これらのプロセスは端末から特に命令を与えなくてもコンピューターの中で自分で仕事をしてくれているこびとさんのようなもので、デーモン(daemon)などと呼ばれている。
これらの多くは何か(キーボードだったり、時計だったり、ネットワークのあるポートだったり、他のプロセスからの入力だったり)を見張っていて、何らかの処理が必要になればそれを行うといった仕事(サービス)をしている。
一口にデーモンといっても仕事の内容は様々で、コンソールからの入力を担当するものようにほぼ不可欠に近いものもあれば、ウェブなどのサーバープログラムのように特定の計算機以外では動かしておく必要がないものもある。システムをどのように使うかに応じて、どのようなデーモンを起動しておく必要があるのかは変わってくる。
比較的最近の主な linux のディストリビューションでは systemd というデーモンが他のデーモンの起動などを管理するようになっている。
起動時にそれらのサービスを自動的に起動するかどうかの設定は
$ systemctl list-unit-files
とすると表示される。
また特定のデーモンについての設定及び状態をみるには、例えば
$ systemctl status systemd-timesyncd
のようにする。
ここで例に使った systemd-timesyncd 時計を制御してくれるデーモンとなっている。
時計の状態にしては
user@host:~$ timedatectl timesync-status
Server: 185.125.190.57 (ntp.ubuntu.com)
Poll interval: 34min 8s (min: 32s; max 34min 8s)
Leap: normal
Version: 4
Stratum: 2
Reference: C279CFF9
Precision: 1us (-25)
Root distance: 747us (max: 5s)
Offset: +11.762ms
Delay: 243.977ms
Jitter: 32.132ms
Packet count: 309
Frequency: -0.623ppm
とするとより詳しい情報をみることができる。
*システムの起動時*にデーモンを 動かすかどうかの設定は、
$ sudo systemctl enable ssh
$ sudo systemctl disable ssh
のようにして変更することができる。
また*その場*でデーモンを 動かす/止める 場合には、
$ sudo systemctl start chronyd
$ sudo systemctl stop chronyd
などのようにすればよい。
デーモンの起動設定についてはとりあえず今のところあまり変更する必要はないが、後日いくつかのサーバーについては起動するよう設定変更することになる。
**システムのログ(記録)ファイルについて
デーモンの活動内容は普段あまり目につくことはないが、処理内容の記録や発生したエラーについてなど、管理者に知らせるべき情報についてはファイルに記録したりあるいは端末に出力するように設定しておく必要がある。こういった記録ファイルは /var/log/ ディレクトリに保存する設定が一般的となっている。
いろいろなデーモンからのメッセージはまとめて管理できた方が便利だ。ということで、各デーモンからのメッセージを一旦受け取って、それらを設定に従って適宜記録したり表示したりといった処理をするデーモンが使われている。このシステムでは rsyslogd という名前のデーモンになっている。このデーモンは設定ファイル(/etc/rsyslog.conf 及び /etc/rsyslog.d/ 内の設定ファイル)の内容に従って、いくつかの方法で同じシステム上の他のデーモンや、他のシステム上で動いているデーモンからネットワーク越しに受け取ったメッセージをファイルに記録、あるいは端末に表示、他のシステムに転送するなどといった処理を行う。
>>
実際の主な設定については /etc/rsyslog.d/50-default.conf というファイルにかかれている。こちらでは一般的なログを記録するファイルとして /var/log/syslog が指定されている。
<<
デフォルトの設定ではメインのログファイルは /var/log/syslog で、その他にメールを処理するデーモンからの出力を記録する /var/log/mail.log など、記録する内容に応じたログファイルが指定されている。
サーバーを動かしてみたけれども想定したとおりに動いてくれない、といった場合にはログファイルに残されたメッセージが重要な手がかりとなるので、この設定ファイルだとか、そこで指定されているログファイルを見にいくことになる。
*通信の制限(ファイアーウォール)
最近は(といってもずいぶん前からではあるが)インターネット上も物騒なので、ネットワークからの通信については無条件で受け付けるのではなくいろいろな形で制限をかけて身を守ることが必要になっている。
ネットワークからの通信は、待ち受けているデーモンがそれを受け取って処理することで成立するが、途中いくつかの段階で通信の制限をかけることができる。
-ルーターが転送を拒否する
-通信先の計算機に到達しても、実際の処理を担当するデーモンに取りつがない(門前払い)
-担当デーモンが一応受け取るが、(送り主などの情報から)通信の内容は見ないで捨てる
-担当デーモンが通信の内容を見た上で処理を拒否する
などのようなものがある。後に行くほど多くの情報を元に処理するか捨てるかを判断できるが、その分悪意のある通信により処理能力を食われてしまったり、セキュリティー上の弱点をつかれてしまうリスクも出てくるので、必要に応じて使い分けるのがよい。
ルーターは専用の機器を使うことが多いが、サーバーやワークステーションとして使っている Linux のシステムにルーターの役割をさせることもできる。
この段階で行う通信の制限は、(より詳しい通信内容を調べて制御するファイアーウォールを利用する場合もあるが)多くの場合送信元のIPアドレスや送信先のポートなど、受け取ったパケットの転送のための情報を元に通信を拒否するかどうかを判断する。
とりあえずルーターとして設定しない状態の計算機の場合、自分のシステム上でサーバープログラムを動かしていなければ、自分から発信した通信への相手からの応答さえ受け取れればよいということになる。その他の通信は基本的に受け取らずに捨ててしまうという設定にしておけばよい。
メールやウェブなどのサーバーとして動かす計算機については、不特定のマシンからの通信を受け付ける必要が生じる。例えば、ウェブサーバーを動かす場合には「port 80(ウェブサーバー用のポート)への通信については(基本的には)相手のIPアドレスによらず許可する」という設定をすることになる。
一方不特定多数からのアクセスを想定しているわけではない、ssh によるログインなどのためのサーバーについては、接続を許可する相手(接続元)を特定のIPアドレスのみ、あるいは同じローカルネット内などに制限したりすることも多い。
自ホストが2つ(以上)のネットワークセグメント(LAN)の間をつなぐゲートウェイとなっている場合には、firewall が取り次ぐ通信の取捨選択を制御するために使われることになる。そのような場合にはもう少し複雑な設定が必要になる。
この段階を通過した自分宛の通信は、サーバープログラム(デーモン)に渡されるが、多くのデーモンではまず「通信の内容を見ないで捨てる」かどうかの判定が行われる。ここでもやはりほぼ前段階と同様で発信元のIPアドレスが使われるのだが、ここではIPアドレスだけではなくIPアドレスを元に検索して得られる相手のホスト名(ドメイン名)を基準にふるい分けることもできる。
>
少し前までは、いくつかの代表的なネットワークデーモンについては、共通の設定ファイル(/etc/hosts.allow,/etc/hosts.deny)を使って通信の制限をかけられる仕組みが広く使われていた(tcp_wrapper)が、現バージョンでは使われなくなっている。
<
というわけで、他の計算機からの通信を受け付けるようにしたい場合、通信内容を処理するサーバープログラムを動かしておくだけではなく、条件を満たす相手からの通信を許可するようにファイアーウォールや途中のルーターの設定を変更しておく必要がある。これを忘れるとサーバーのプログラムは動いているはずなのになぜかつながらないといった状態になってしまうことがある。
*ssh による通信
ネットワーク上の他のマシンにログインする際には ssh が標準的に使われている。ssh での通信は暗号化されるので、インターネット経由で通信する際に途中でデータを覗き見られても簡単にはその内容がわからないようになっている。
ログインして仮想端末上でシェルを使うような使い方が基本だが、GUIベースのファイル転送用のソフトウェアでも ssh を利用してファイルを転送できるようになっているものが多い。また、ssh での接続を通してグラフィック画面を転送するような使い方もできる。
ssh での通信を行うためには、接続を受け付ける側で sshd というサーバープログラム(デーモン)を動かしておく必要がある。
ただし ubuntu をインストールした直後の状態だと、クライアント側として接続するための ssh コマンドは最初から使えるようになっているのだが、サーバーのプログラムはインストールされていない。
サーバーの状態を確認するには、サービス名としては (sshd ではなく) ssh を指定する。
$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
Active: active (running) since Fri 2025-10-17 11:13:00 JST; 6 days ago
TriggeredBy: ● ssh.socket
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 2998 (sshd)
Tasks: 1 (limit: 4615)
Memory: 3.4M (peak: 19.8M)
CPU: 101ms
CGroup: /system.slice/ssh.service
└─2998 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
インストールされていない場合は
$ sudo apt install ssh
とするとサーバー及びクライアントの両方がインストールされるはずだ。
**ssh の基本的な使い方
>>
以下では、ssh を使ってネットワーク越しに linux125 というホストにログインする手順をみてみます。
>>
手元の(仮想)マシンは linux1XX とします。(XXX の部分が各自異なる番号になるはずです)
>>
また、linux125 上にはユーザーアカウントとして testuserX という名前のアカウントを作成してあります。
(それぞれの仮想マシンの番号から 100 を引いた番号のものを使ってください)
<<
>>
現在どのホストに対して命令を与えているか、混乱しやすいです。プロンプトをよくみて確認しながら作業してみてください。
例えば linux125 というマシンに、testuserX というアカウント名でログインするには
[youraccount@linuxXXX]$ ssh linux125 -l testuserX
(ここの -l の縦棒は小文字のL)あるいは
[youraccount@linuxXXX]$ ssh testuserX@linux125
のように入力する。
もちろんこのようにしてログインするためには linux125 という計算機上に testuserX というアカウントが既にあって、そのアカウントのパスワードを知っている(あるいはそのアカウントにログインできるように登録した秘密鍵を持っている)ということが必要になる。
通信元で現在利用しているアカウント名と、通信先でログインしようとしているアカウント名が一致している場合には、アカウント名の入力を省略することもできる。
ssh でログインすると、その仮想端末上で入力した命令はログインした先の計算機で動いているシェルが処理することになる。(元々端末上で動いているシェルは、受け取った入力をそのまま接続先に転送する形で処理する。)この状態は ssh でログインした時に起動されたログイン先のシェルを終了させるまで続く。
シェルを終了させるには logout あるいは exit コマンドを使う。
testuserX@linux125$ exit
例えば目の前の直接操作しているコンピューターを再起動するつもりで "sudo reboot" と入力したらリモートで接続している先のコンピューターが再起動してしまうといったこともありえる。ということで、現在どれに対して命令を与えているのかについてはよく注意する必要がある。
特にリモートでログインしての作業が終わった後には、ログアウトし忘れないように気をつけること。
今回利用しているシステムのデフォルトの設定では、現在命令を処理しているホスト名がプロンプトに表示されているはずなのでそれを見ればよい。また hostname コマンド等を使って確認することもできる。
グラフィック端末から ssh で他の計算機に接続する際に
youraccount@linuxXXX $ ssh -X testuserX@linux125
のように "-X" を追加しておくと、グラフィック画面への出力を伴うプログラムを接続先の計算機で動かして、それを現在の端末上に表示することもできる。
例えば接続している先のマシンに gnuplot (グラフを書くためのアプリケーションプログラムの一つ)がインストールされている場合、手元のマシンには gnuplot がインストールされていなくても
testuserX@linux125 $ echo 'plot for [n=0:4] besjn(n,x) t "J".n' | gnuplot -p
のようにすると手元の端末上にグラフを表示させることができるはずだ。
ちなみにこのプログラムは
youraccount@linuxXXX $ sudo apt install gnuplot
のようにするとインストールできる。
**公開鍵/秘密鍵のペアを使ったログイン
ssh での通信は通信内容が暗号化されているので、ログインする際に送信するパスワードを通信の途中で傍受されてパスワードが漏れるということは、おこりずらいということになっている。
しかし、パスワードの長さは通常それほど長くないし、また人間が選ぶ文字列は偏りがあるので、「総当たり」などの力技でパスワードを探り出されてしまうという危険性は意外に大きい。
そこで、より安全に認証するための方法として、
-接続先のアカウントに「公開鍵」を登録しておく
-接続元が対応する「秘密鍵」を持っている場合にのみログインできる
--秘密鍵は結構長くて、ファイルに記録されている
--総当たりで破られることはほぼないだろうと思われる。
--また秘密鍵を記録したファイル自体も暗号化しておき、鍵を使うためには本人しかしらない(はずの)「パスフレーズ」の入力が必要な状態にしておく
--認証の際には、秘密鍵そのものは送信せずに、秘密鍵を持っていることを確認する
~という方法が使われている。
ここではこの方法についても試しておくことにする。
+秘密鍵/公開鍵ペアの作成
youraccount@linuxXXX $ ssh-keygen
というコマンドを使うと秘密鍵と公開鍵のペアを作成してくれる。コマンドを入力すると鍵を保存するファイル名を聞かれるが、これはとりあえずデフォルトのままでよいので単に enter を押せばよい。その後パスフレーズの設定のために入力待ちになるので、パスフレーズを入れること。途中にスペースなどもはさんで構わないので、短い文章のようなものにしておくのがよいということになっている。生成する鍵を保存するファイル名だとかどのような暗号を使うか等もコマンドラインから指定できるが、とりあえずはデフォルトのものでいいだろう。
+作成された鍵の確認
youraccount@linuxXXX $ ls -al ~/.ssh
ホームディレクトリの下に .ssh というディレクトリがある。ピリオド (.) から始まる名前のファイルやディレクトリは隠しファイル扱いとして設定によってはみえなくなっている場合もあるが、上の例のように直接ファイル名(ディレクトリ名)を指定すれば見ることができる。また ls の場合は "-a" オプションを追加すれば隠しファイルも表示させることができる。ここに id_ed25519 と id_ed25519.pub という2つのファイルが新しくできているはずだ。
youraccount@linuxXXX $ cat ~/.ssh/id_ed25519
youraccount@linuxXXX $ cat ~/.ssh/id_ed25519.pub
などとして一応中身を見ておくとよいだろう。
youraccount@linuxXXX $ ls -l ~/.ssh
のようにしてそれらのファイルへのアクセス許可情報も見ておくこと。とくに id_ed25519というファイル「秘密」鍵というくらいなので、本人以外は読み書き不可になっていなければならない。
+公開鍵を接続先に登録
~この公開鍵ファイル(id_ed25519.pub)の中身を鍵を使ってログインする先のアカウントに登録しておく。この作業は ssh-copy-id というコマンドで行うことができる。このコマンドが使えない場合は、ログイン先のアカウントのホームディレクトリの下の.ssh ディレクトリにある、authorized_keys というファイルに(authorized_keys ファイルがない場合は作成して)公開鍵ファイルの中身を追加しておけばよい。
~とりあえず自分のアカウントで試してみるとよいだろう。
>
ファイル名の一部 ed25519 の部分は鍵の種類を表している。現在の ubuntu ではこれがデフォルトになっているが、rsa という方式がかなり長く使われてきて、現在でも多くのシステムで使われている。どちらの方式の鍵でもほとんどのサーバーでは対応していると思われるので、通常の利用の範囲で違いを意識することはないだろう。
<
~
鍵を登録するまでは、ログインの際には接続先アカウントのパスワードを聞かれる。
[youraccount@linuxXXX]$ ssh localhost
youraccount@localhost's password: _
~
鍵を登録するために
youraccount@linuxXXX $ ssh-copy-id localhost
と入力してみる。ssh で初めて接続する相手の場合、この相手が本物であるとしてよいかどうか聞いてくるかもしれない。その後、ssh の秘密鍵の暗号化を解除するためのパスフレーズをきかれる。また、公開鍵を接続先(といっても上の例では自分なのだが)の "authorized_keys" ファイルに書き込むために必要となるのでパスワードを聞かれるはずだ。
~無事に書き込むことができれば、登録はできているはずだ。
+鍵を利用してのログイン
~ssh で接続する際、鍵を使った認証が可能であればパスワード認証よりもそちらを先に試すようになっている。そこでいったん登録が済むと、最初と同様に
[youraccount@linuxXXX]$ ssh localhost
とした際に、接続先のアカウントのパスワードではなく、自分手元の秘密鍵のパスフレーズを聞かれるようになるはずだ。
>
実はグラフィック端末のデフォルトの設定では、端末にログインしてからログアウトするまでの間、一度パスフレーズを入力して秘密鍵を復号すると、その復号した鍵を覚えておくプログラムがウラで動いている。そのため、パスフレーズを一度入力するとグラフィック端末からログアウトするまでは再入力の必要はない。ということで、パスフレーズを長めにしておいてもそれほど負担にはならないはずだ。
<
localhost に ssh でログインした場合、 ssh でログインした先も全く同じシステムなので区別がつかないが、ssh をかけた先と、かける元の2重にログインしている状態になっている。ややこしいのでとりあえず一回 exit コマンドを入力して、元のレベルに戻っておこう。
youraccount@linuxXXX $ exit
~ちなみに、この場合現在ログインしているアカウントを表示する who コマンドのオプションとして am i をつけると
testuserX@linux125 $ who am i
testuserX 2024-10-24 11:12 (::1)
のように、自分がどのアカウントにどこからログインしているかを知ることができる。上の例の場合は ::1 (これは localhost をあらわす IPv6 のアドレス)からログインしている testuserX であると表示されている。
+他のマシンのアカウントへの公開鍵の登録
~
youraccount@linuxXXX $ ssh-copy-id testuserX@linux125
とすることで、公開鍵を接続先の authorized_keys ファイルに登録できる。
~登録が済んだら、ssh での接続を試してみる。
youraccount@linuxXXX $ ssh testuserX@linux125
...
~
こんどはパスワードではなくパスフレーズを聞かれるはずだが、この秘密鍵を先程一度使っている場合は、端末の裏で動いているプログラムが秘密鍵を使える状態になっているので何も入力しなくてもログインできる。
ただしログインしても
Last login: Fri Oct 24 11:06:44 2025 from linuxXXX
のようなメッセージが表示されてシェルのプロンプトが表示されるだけなので、表示されるメッセージをよく見てログインできているかどうか、確認すること。
~
testuserX@linux125 $ hostname
linux125.in.b508.net
testuserX@linux125 $ who am i
testuserX pts/2 2025-10-24 10:21 (192.168.125.125)
testuserX@linux125 $ logout
youraccount@linuxXXX $
-----
*練習課題
+linux125 という名前のホストに gnuplot をインストールしておくので、ssh を使ってログインしてみて、自分の端末上で適当なグラフを表示できることを確認せよ。(ログイン用のアカウント名は授業の時に知らせます)
--確認できたら忘れずにログアウトもしておくこと。
+ssh の鍵を用いたログインについて試してみる。localhost 上の自分のアカウントから linux125 上の指定されたアカウントに、鍵認証でログインできるよう設定してみること。