CentOS8設定の基礎 – dnfについて その1

Windowsではソフトウェアをインストールする際には、そのソフトウェアの公式サイトに行ってインストールすることが基本だと思います。(最近はWindowsストアというのも出てきたので一概にそうとも言えないですが)

しかし、Linuxではよく使われる大半のソフトウェアはコマンド一つでインストールすることができます。

これがdnfというコマンドになります。

dnfはDandified Yumの略で、直訳すると「おめかししたYum」となります。

実はCentOS7まではdnfではなくyumというコマンドがこの役割を果たしていました。

ちなみにyumはYellowdog Updater Modifiedの略なのですが、まあyum yum(もぐもぐ)の略って事で覚えた方が覚えやすいんじゃないでしょうか。こう、擬人化したLinuxちゃんがソフトウェアをもぐもぐしてる感じで。

なお、この記事で触れるレベルではdnfもyumも使い方は同じなので、CentOS7を使っている方はdnfをyumと置き換えれば問題なく使えます。

この記事で行うこと

  1. dnfとは
  2. 主なコマンド
    1. update
    2. info
    3. install
    4. remove
  3. 自動更新の設定

1. dnfとは

Red Hat系のLinuxでは基本的にソフトウェアをRPMパッケージという単位で管理しています。

Windowsにおいて「プログラムと機能」からアプリケーションをアンインストールするとそのプログラムに関連したファイルが一気に消えるように、LinuxではRPMパッケージを消すとそのプログラムに関連したファイルが一気に消えます。

これを管理するのに使うのがdnfコマンドです。

なおdnfはWindowsの「プログラムと機能」よりも多機能で、アンインストールするだけではなくソフトウェアをダウンロードしてインストールすることもできますし、インストールやアンインストールの際にわざわざ指定しなくても関連するRPMパッケージまで一緒にインストール・アンインストールしてくれます。

2. 主なコマンド

では、早速dnfを使ったコマンドの解説に入ります。

2-1. update

このコマンドはサーバ内のソフトウェアやOSそのものの更新を行うためのコマンドです。

dnfで管理されているソフトウェアはこのコマンドで更新できます。

使い方は以下の通りです。

[root@localhost ~]# yum update [更新したいパッケージの名称]

なお、[更新したいパッケージの名称]の部分を書かないと、更新可能なもの全てが更新されます。

コマンドを実行すると、更新されるものの一覧が表示されて確認されますので、そこでyを入力すると更新が開始されます。

趣味でサーバをやっている場合、最も怖いのはサーバが落ちることよりもサーバに侵入される事です。

更新したときの影響を心配するよりも更新しないことによるリスクを考えてなるべく更新するようにしましょう。(自動更新の設定についても後述します)

よく使われるオプションは以下の通りです。

-y 確認を省略して全てyと入力したことにします。確認が煩わしい時に使います。

2-2. info

インストール可能なパッケージパッケージの情報を確認します。

使い方は以下の通りです。

[root@localhost ~]# dnf info [確認したいパッケージの名称]

[確認したいパッケージの名称]の部分を書かないと書かないとインストール可能な全てのパッケージが表示されます。が、大量に出てくるのであまり意味がありません。

パッケージをインストールしたか忘れたので確認したいとき、バージョンを確認したいときなどに使います。

2-3. install

パッケージをインストールします。

使い方は以下の通りです。

[root@localhost ~]# dnf install [インストールしたいパッケージの名称]

[インストールしたいパッケージの名称]を記載しないとエラーとなります。(インストールできるソフトが全部インストールされたりしたら時間かかるやら容量圧迫するやら設定の穴が量産されるやらで大惨事ですからね)

ちなみに、このコマンドも -y オプションが使えます。

ただ、一つのパッケージをインストールするつもりでも依存関係の問題で複数のパッケージがインストールされたりするので、何がインストールされるか確認をした方が良いと考えます。

基本的にはdnfでインストールできるソフトウェアは全てdnfを使ってインストールすることをオススメします。

稀に「通はソースコードから直接インストールする」とか何とか言ってる所があったりしますが、理由が無ければインストールにも更新にも手間がかかるだけで無意味です。

しっかりと文明の利器を使えるようにしましょう。

2-4. remove

パッケージをアンインストールします。

コマンドの使い方は以下の通りです。

[root@localhost ~]# dnf remove [アンインストールしたいパッケージの名称]

これも[アンインストールしたいパッケージの名称]を空欄にすると削除対象がないと言われ、何も起りません。(流石にシステムそのものをアンインストールとかにはならないです)

このコマンドも -y オプションが使えますが、依存関係で意図しないパッケージが消えたりしないようにちゃんと確認を行うことをおすすめします。

3. 自動更新の設定

「2-1. update」でも触れたように更新を忘れていてセキュリティホールが出来ていたなんていうのはゾッとしない話です。

そうならないようにdnfでは自動更新の設定を行うことが出来ます。

手順は以下の通りです。

まず、自動更新を行うためのパッケージをインストールします。

[root@localhost ~]# dnf install dnf-automatic

次に、自動更新をsystemctlで起動・有効化します。

[root@localhost ~]# systemctl enable --now dnf-automatic-install.timer
Created symlink /etc/systemd/system/multi-user.target.wants/dnf-automatic-install.timer → /usr/lib/systemd/system/dnf-automatic-install.timer.
  • --now : enable コマンドを使うときに設定することで、 start も同時に実行されるというオプションです。

なお、今回は自動で更新のインストールまでするものを起動しました。

起動するものが dnf-automatic-install.timer だと更新の自動インストール、 dnf-automatic-notifyonly.timer だと更新の通知のみ、 dnf-automatic-download.timer だと更新のダウンロードまでを行います。

ただ、システムが落ちて損害を受けるようなサーバでない限りは自動インストールを行うように設定した方が安全です。(というか落ちて困るようなサーバをこんなサイト見ながら運用しようとしないでください)

まとめ

今回はCentOS8のパッケージ管理システムdnfについて説明しました。

dnfはソフトウェアのインストール時に真っ先に上がる選択肢なので、ぜひ覚えておいてください。

dnfでインストールできない、バージョンが古すぎるといった問題が見つかったときに初めて他の選択肢を検討しましょう。

あと、アプリケーションの更新は絶えず行うようにしてくださいね。

次回はリポジトリと設定方法について解説します。

CentOS8のSSH設定 – 接続ポートの変更

rootへの直接アクセスの禁止」と「公開鍵認証の設定」をしっかり行えば不正にSSHアクセスをされてしまうという心配はほとんどありません。

しかし、サーバを公開してみるとすぐに海外のIPアドレスからの接続が失敗したというログを目の当たりにするでしょう。

そうそう破られる事はないと分かっていても、心臓に悪いです。

このため、SSH接続を行うポートをデフォルトの22番ポートから別のポートに変えたいと思います。

イメージとしては、常に不審者がうろついている正門を埋め立てて、代わりに裏口を作ってそこで出入りする感じです。

※この設定を行う前に、お使いのSSHクライアントがポート番号の指定に対応しているか確認してください。

この記事で行うこと

  1. ファイアウォールの設定変更(新しいポート番号での接続許可)
  2. SSHとSELinuxの設定の変更
  3. ファイアウォールとSELinuxの設定変更(22番ポートでの接続禁止)

1. ファイアウォールの設定変更(新しいポート番号での接続許可)

ファイアウォール(Firewall)については以前の記事を確認してください。

https://wrd.yuto-shin.net/2020-06/setting-knowledge-firewall-centos8

上記の記事に従って変更先のポートを番号で指定して許可する方法でも問題ないです。

しかし、今回は新たにserviceを作成してそれを許可してみましょう。

これによって後々ファイアウォールの設定を確認したときに、何のためにこの番号を開けていたのか忘れるといった事がなくなります。(SSHの場合は普段から使うので忘れることはそうそうないと思いますが)

まず、 /usr/lib/firewalld/services/ にある、ssh.xml を同じディレクトリにコピーします。

コピー先は同じディレクトリにしてください。コピー時のファイル名は自分が分かりやすいように付けてください。今回は new-ssh.xml とします。

[root@localhost ~]# cp /usr/lib/firewalld/services/ssh.xml /usr/lib/firewalld/services/new-ssh.xml

そして、このコピーしたファイルを開くと以下のように設定の中身が表示されます。

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>
  • shortタグ:サービス名(簡潔なサービスの説明)
  • descriptionタグ:サービスの詳細(詳しいサービスの説明)
  • portタグ:実際に開放するポートの指定

今回はあくまでもSSHに使うポートなので、shortタグとdescriptionタグは変えません。

portタグのport番号だけ22から好きな数字に変えてください。(1024~65535以下に設定してください)

今回は普段記事を公開する時間にあやかって1200と設定します。

設定後は以下のようになります。

&amp;lt;?xml version="1.0" encoding="utf-8"?>
&amp;lt;service>
  &amp;lt;short>SSH&amp;lt;/short>
  &amp;lt;description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.&amp;lt;/description>
  &amp;lt;port protocol="tcp" port="1200"/>
&amp;lt;/service>

次に、この新たなサービスを認識させるためにファイアウォールの再読み込みを行います。

[root@localhost ~]# firewall-cmd --reload

そして、新たに追加したサービスを許可するようにします。このとき、指定する名前は、shortタグの中身ではなく、ファイル名となります。

[root@localhost ~]# firewall-cmd --add-service=new-ssh --permanent
success
[root@localhost ~]# firewall-cmd --reload
success

追加した後は反映されているか確認をしましょう。

[root@localhost ~]# firewall-cmd  --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp3s0
  sources:
  services: new-ssh ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

2. SSH設定の変更

※これ以降、絶対に途中で作業を止めずに最後まで行ってください。途中で止めた場合SSHで接続ができなくなる可能性があります。

無事にファイアウォールが開いたら、次はSSH側の設定を変更します。

rootへの直接のアクセスを禁止したとき同様に /etc/ssh/sshd_config を編集します。

編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。例では1200になっていますが、この数字はファイアウォールの設定の時と同じ番号に設定してください。

- #Port 22
+ Port 1200

編集が終わったらSSHを再起動しましょう。

次に、SELinuxの設定です。

SELinuxは詳しくはまた別途解説しますが、万が一悪意のある人に侵入されてもなるべく好き勝手できないように抑えてくれるアプリケーションです。

これがあるのでポート番号の変更をする際はSELinuxに「別のポート番号でSSH接続しますよ。これは悪意のある人物が勝手に変えてる訳じゃないですよ」って教える必要があります。

以下のコマンドとなります。

[root@localhost ~]# semanage port -a -t ssh_port_t -p tcp 1200
  • semanage : SELinuxの設定変更を行うためのコマンドです。SELinux Managerの略だと思います。
  • port : ポートに関係する設定を変えるコマンドです。他にもユーザの設定など色々な設定があります。
  • -a : 新しいルールを追加(add)する事を指定するオプションです。
  • -t ssh_port_t : 追加するルールのタイプを指定します。今回はsshのポートを指定しています。
  • -p tcp : プロトコルを指定しています。SSHはTCP接続なので、tcpを指定しています。
  • 1200 : ポート番号を指定しています。例では1200を指定していますが、ファイアウォールの設定やSSHの設定で指定した番号と同じ番号を指定してください。

もし、ちゃんとSELinuxに設定が反映されているか気になる場合は以下のコマンドを使ってみてください。

[root@localhost ~]# semanage port -l | grep ssh_port_t
  • -l : 設定の一覧を表示するオプション
  • | : (パイプ)この記号以前に記載されているコマンドの結果を受けてこの記号以降に記載されているコマンドを実行する。そのうち詳しく解説するかもです。
  • grep : 指定されたテキストを含む行を抜き出す。今回は ssh_port_t を抜き出しています。

SELinuxにも伝え終えたところで、SSHを再起動して設定を反映させます。

# systemctl restart sshd

次に、今接続しているSSHは絶対に切らずに新しく接続して変更後のポート番号に繋がることを確認します。

接続ができない場合、3カ所に設定したポート番号(ファイアウォール、SSH、SELinux)に違いがないかを確認してもう一度設定し直してみてください。

3. ファイアウォールの設定変更(22番ポートでの接続禁止)

新しいポート番号で接続できるようになったら、今度は22番ポートを閉じるようにファイアウォールの設定を変更しましょう。

現時点で22番ポートが開いていても、SSHがこのポート番号を使っていないため、アクセスすることはできません。

しかし、今は大丈夫でもこの先何かの間違いでこのポート番号を通じて不正なアクセスを許すことになるかもしれません。

面倒でもリスクを下げるために使わないポートは必ず閉じるようにしましょう。

特段新しいこともないので設定から確認まで一気に記載します。

[root@localhost ~]# firewall-cmd --remove-service=ssh --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp3s0
  sources:
  services: new-ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

ちなみに、SELinuxの方はシステムの既定である22番ポートを消すことはできないできないようです。このため、確実にファイアウォールの方で遮断するようにしましょう。

まとめ

今回はSSHのポート変更の方法について説明しました。

序文でも述べたように実際はこの設定を行わなくても前回までの設定さえしっかり行えば不正なアクセスを受ける可能性は低いです。

なので、一度ポート番号の変更までは行わずにサーバを公開してみるのも良いかもしれません。

実際に大量のアクセス失敗の履歴を見ると、セキュリティに対する意識が高まること請け合いです。(もし本当にやるなら必ずrootでのアクセス禁止と公開鍵認証の設定は漏れなく行うようにしてくださいね)

CentOS8のSSH設定 – 公開鍵認証の設定

SSHではパスワード認証の代わりに公開鍵認証を使うことができます。

公開鍵認証は公開鍵(イメージは錠前)と秘密鍵(イメージは鍵)のペアによって認証を行う仕組みです。

公開鍵(錠前)からは秘密鍵(鍵)を作れないため、仮に公開鍵が悪意のある人に渡っても安全です。(正確に言うと「作るためには長い時間がかかる」となります)

公開鍵認証はパスワード認証に比べて以下のメリットがあるとされます。

  • 安全性が高い
    これは「公開鍵認証だから」というより「自分で入力するわけではないので長くできる」という要素の方が強いですね。数千文字のパスワードを毎回自分で入れられるなら、理論上そっちの方が安全だったりします。
    一応それ以外にも盗聴されていたとしても鍵そのものは盗まれないという公開鍵自体のメリットもあります。
  • 使い回しができる
    パスワードと違って公開鍵は流出しても問題ありません。逆に公開鍵を広く配って「この公開鍵に合う秘密鍵を持っているので私たちは本人です安心してください」なんて使い方がされていたりします。(「電子証明書 公開鍵」で検索してみてください)
    このため使いまわしをしても問題がありません。
    まあ、うっかり秘密鍵が流出したりすると悲惨なことになりますが……

逆にデメリットとしては秘密鍵が無いとSSH接続ができなくなるので、出先でアクセスができなくなるという点があります。(秘密鍵を入れたUSBなんかを持ち歩けば出先でもアクセスできますが、うっかり落としたりすると……)

では、公開鍵認証の設定をしたいと思います。

この記事で行うこと

  1. 鍵の作成
  2. 秘密鍵を持ってくる
  3. 公開鍵を配置
  4. SSHの設定

1. 鍵の作成

※この作業はログインしたいユーザのアカウントで実施します。

以下の通りに公開鍵と秘密鍵のペアを作ります。

$ ssh-keygen -b 4096 -C ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yuto/.ssh/id_rsa): (エンターを押す)
Created directory '/home/yuto/.ssh'.
Enter passphrase (empty for no passphrase): (パスフレーズを入力する)
Enter same passphrase again: (パスフレーズを入力する)
Your identification has been saved in /home/yuto/.ssh/id_rsa.
Your public key has been saved in /home/yuto/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7rJCmFT1deAsnXdJLaouh4XROKshwS9HNQd71RYmBsg
The key's randomart image is:
+---[RSA 4096]----+
|     ....o+o=.+o |
|    .  .E*.= ++..|
|   o   .+=* .oo. |
|  . o . +o....   |
| . o +  S= .     |
|  o + +.o o      |
|   . + o.+       |
|    . o.o o      |
|     ..o.o       |
+----[SHA256]-----+
  • ssh-keygen : SSHの鍵(key)を生成する(generate)コマンドです。
  • -b 4096 : 「-b」はSSHの鍵長(鍵の強さ)を指定するオプションです。デフォルトだと2048ビットですが、若干心もとないので4096ビットに設定しています。
  • -C “” : 「-C」で秘密鍵にコメントを入れることができます。デフォルトだとユーザ名が入ります。個人的にはあまり余計な情報を残したくないので空欄にします。必要に応じて「”」の間にコメントを入れてください。

パスフレーズは秘密鍵を使うときに入力が必要なパスワードです。

これを設定することで万一秘密鍵が流出してもパスフレーズがばれない限りはその鍵を使われずに済みます。

絶対に流出しないという自信があるのであれば設定しなくても良いですが……

2. 秘密鍵を持ってくる

鍵は作成できましたが、今は公開鍵も秘密鍵もサーバ上にあります。

秘密鍵をこちらに持ってこなくてはいけません。

もっとも簡単な方法はSSHクライアントで秘密鍵を開いてコピーペーストをすることです。

$ vi ~/.ssh/id_rsa

viについてはこのページを参照してください。Linuxで設定ファイルを編集するときの基本

ファイル内の -----BEGIN OPENSSH PRIVATE KEY----- から -----END OPENSSH PRIVATE KEY----- までをコピーして新しいテキストファイルに貼り付けて保存します。

これが秘密鍵ファイルとなります。

また、後に問題なく接続ができることが確認出来たらサーバ上の秘密鍵ファイルは削除してください。

3. 公開鍵の配置

公開鍵の場所はすでに正しいところに配置されているため変更する必要はありませんが、SSH接続で使うには公開鍵の名称と権限設定を変える必要があります。

公開鍵の名称を authorized_keys に、ディレクトリの権限許可を「700」に、公開鍵ファイルの権限許可を「600」に設定しましょう。

$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

コマンドの詳細に関しては、名称変更はLinuxの基本コマンド – ファイル操作を、権限設定はLinuxの基本コマンド – 権限設定を確認してください。

この時点で一度公開鍵認証でログインしてみてください。

公開鍵認証を使ったログインの方法は利用しているクライアントごとに違うため、各自で確認してください。

4. SSHの設定

ここではパスワードを使ったSSHでのログインができないように設定をします。

※この設定を行うとパスワードでのログインができなくなります。必ず公開鍵認証を使ったログインができることを確認してから設定してください。

現時点ではパスワードを使ったログインも許可されている状態です。せっかく安全な公開鍵認証での接続ができるようになっても脆弱なパスワード認証が破られて侵入されたりしたら目も当てられませんからね。

ファイルは前回rootへの直接ログイン禁止の時と同じファイルです。

 /etc/ssh/sshd_config

ファイルの編集はこのページを参照してください。Linuxで設定ファイルを編集するときの基本

今回は以下の部分を編集します。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。

- PasswordAuthentication yes
+ PasswordAuthentication no

設定ファイルを編集したらSSHを再起動して完了です。

# systemctl restart sshd

SSHでパスワードを使ったログインを試してみてください。

パスワードの入力画面に入るまでもなく接続が拒否されるはずです。

もし、ログインできてしまった場合は設定ファイルの編集を間違っていないか、SSHを再起動したか確認してみてください。

まとめ

今回はSSHの公開鍵認証の設定をしました。

鍵を持っていない端末からは接続できないなど面倒な点もありますが、安心のためと思って是非設定することをお勧めします。

次回はSSH周りの設定の最後「SSHの接続ポート変更」を行います。