Linuc102メモ⑪セキュリティ

セキュリティ管理業務の実施

  • 外部からの侵入に対するセキュリティを高める

    • 必要なソフトウェアのみインストールし、不要なサービスは起動しない

    • ホストレベルの適切なアクセス制限

    • パケットフィルタリング

  • 内部からの侵入に対するセキュリティを高める

    • 適切なユーザーパスワード管理を行う

    • rootユーザー権限で動作するプログラムを最小限にし、定期的にチェック

chage

  • ユーザーのパスワード有効期限設定する。

  • 強制的にパスワード変更を促すことができる。

  • オプションつけないと対話モードになる。

  • シャドウパスワードを設定している場合は、/etc/shadowに格納されている。

chage -l ken 特定のユーザーのパスワード有効期限に関する情報を表示

[root@CentOS7 ken]# chage -l ken
最終パスワード変更日                            : 504, 2023
パスワード期限:                                 : なし
パスワード無効化中                                      : なし
アカウント期限切れ                                              : なし
パスワードが変更できるまでの最短日数            : 0
パスワードを変更しなくてよい最長日数            : 99999
パスワード期限が切れる前に警告される日数                : 7

who

  • ユーザーのログイン状況を確認できる。

  • wコマンドを使うと、ログイン中のユーザーに加えて、システム情報を表示。

  • /var/log/utmpファイル参照

[root@CentOS7 bin]# who
root     tty1         2023-07-30 00:24
ken      pts/0        2023-08-01 07:01 (192.168.100.4)
[root@CentOS7 bin]# w
 05:56:48 up 10 days, 18:46,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      30 723  7days  0.02s  0.02s -bash
ken      pts/0    192.168.100.407    0.00s  0.41s  0.00s sshd: ken [priv

last

  • 最近ログインしたユーザーの一覧を表示。

  • /var/log/wtmpファイルを参照。

[root@CentOS7 bin]# last
ken      pts/0        192.168.100.4    Tue Aug  1 07:01   still logged in
ken      pts/0        192.168.100.4    Sun Jul 30 00:25 - 17:41  (17:15)
root     tty1                          Sun Jul 30 00:24   still logged in
ken      pts/0        192.168.100.4    Sun Jul 16 07:32 - 15:17 (7+07:44)
reboot   system boot  3.10.0-1160 Sun Jul 16 07:32 - 05:59 (20+22:27)

netstat、ss、lsof

ネットワーク機能に関する様々な情報を表示。
開いてるポートを確認するときによく利用する。

[root@CentOS7 bin]# netstat -atu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN
tcp        0      0 CentOS7:domain          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 localhost:ipp           0.0.0.0:*               LISTEN
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN
udp        0      0 CentOS7:domain          0.0.0.0:*
[root@CentOS7 bin]# ss -atu
Netid State      Recv-Q Send-Q                                                                                                             Local Address:Port                                                                                                                              Peer Address:Port
udp   UNCONN     0      0                                                                                                                  192.168.122.3:domain                                                                                                                                       *:*
udp   UNCONN     0      0                                                                                                                       *%virbr0:bootps                                                                                                                                       *:*
udp   UNCONN     0      0                                                                                                                              *:sunrpc                                                                                                                                       *:*
udp   UNCONN     0      0                                                                                                                              *:mdns                                                                                                                                         *:*
udp   UNCONN     0      0                                                                                                                      127.0.1.1:323                                                                                                                                          *:*
udp   UNCONN     0      0                                                                                                                              *:53976                                                                                                                                        *:*
udp   UNCONN     0      0                                                                                                                              *:flexlm                                                                                                                                       *:*
udp   UNCONN     0      0                                                                                                                           [::]:sunrpc                                                                                                                                    [::]:*
[root@CentOS7 bin]# lsof -i
COMMAND      PID   USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd        1   root   44u  IPv6   18211      0t0  TCP *:telnet (LISTEN)
rpcbind      574    rpc    6u  IPv4   18520      0t0  UDP *:sunrpc
rpcbind      574    rpc    7u  IPv4   18522      0t0  UDP *:flexlm
rpcbind      574    rpc    8u  IPv4   18523      0t0  TCP *:sunrpc (LISTEN)
rpcbind      574    rpc    9u  IPv6   18524      0t0  UDP *:sunrpc
rpcbind      574    rpc   10u  IPv6   18525      0t0  UDP *:flexlm
rpcbind      574    rpc   11u  IPv6   18526      0t0  TCP *:sunrpc (LISTEN)
chronyd      597 chrony    5u  IPv4   20301      0t0  UDP localhost:323

nmap

攻撃者がネットワーク経由で開いてるポートを確認する行為をポートスキャンという。
ポートスキャンするためのコマンドがnmapである。

[root@CentOS7 bin]# nmap google.com
SYN Stealth Scan Timing: About 99.99% done; ETC: 07:19 (0:00:00 remaining)
Nmap scan report for google.com (172.217.175.238)
Host is up (0.050s latency).
rDNS record for 172.217.175.238: nrt12s29-in-f14.1e100.net
Not shown: 998 filtered ports
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

fuser

ポートを開いてるプロセスを特定するコマンド。

ユーザーのログイン制限

  • .bash_profileファイルの一部「export TMOUT=数値」で設定すると自動ログアウト時間を設定できる。

  • touch /etc/nologin ←を作成しておくとrootアカウントによるログイン以外は禁止される

  • password -l ken、usermod -l ken ←特定のユーザーアカウントをロックすることができる

ユーザーのリソース利用制限-ulimit

ユーザーが利用できるリソースを制限するコマンドがulimitである。
ulimit -a で制限の設定値をすべて表示できる。
ulimititedとなっている項目は制限されていない。

[root@CentOS7 bin]# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7153
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7153
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

ulimit -u 1024 ユーザーが使用できるプロセス数を1024に制限する。

su

su - ユーザー名で、ユーザー変更ができる。
exitコマンドを使うと、元に戻れる。

[root@CentOS7 bin]# su ken
[ken@CentOS7 bin]$ exit
exit
[root@CentOS7 bin]#

sudo

suコマンドで一度root権限を取得してしまうと、rootユーザーができることならなんでもできてしまう。
特定のコマンドのみ実行を許可したい場合は、sudoを使用する。

visudo

sudoコマンドの利用設定をするには、rootユーザーでvisudoコマンドを使用する。デフォルトのエディタで/etc/sudoersファイルが開かれる。

例えば、kenユーザーにshutdownコマンドが実行できるように設定するには以下のようになる。

ken ALL=(ALL) /usr/sbin/shutdown

ホストのセキュリティ設定

使用していないサービスの無効化

ssで使用していないサービス確認して、使用していないサービスはsystemctl stopで停止。
また、次回システム再起動をかけたときに、再び有効にならないように、systemctl disable サービス名

[root@CentOS7 etc]# ss -atl
State       Recv-Q Send-Q                                                                                                               Local Address:Port                                                                                                                                Peer Address:Port
LISTEN      0      128                                                                                                                              *:sunrpc                                                                                                                                         *:*
LISTEN      0      5                                                                                                                    192.168.132.1:domain                                                                                                                                         *:*
LISTEN      0      128                                                                                                                              *:ssh                                                                                                                                            *:*
LISTEN      0      128                                                                                                                      127.0.1.2:ipp                                                                                                                                            *:*
LISTEN      0      100                                                                                                                      127.0.3.1:smtp                                                                                                                                           *:*
LISTEN      0      128                                                                                                                           [::]:sunrpc                                                                                                                                      [::]:*
LISTEN      0      128                                                                                                                           [::]:ssh                                                                                                                                         [::]:*
LISTEN      0      128                                                                                                                          [::1]:ipp                                                                                                                                         [::]:*
LISTEN      0      128                                                                                                                           [::]:telnet                                                                                                                                      [::]:*
LISTEN      0      100                                                                                                                          [::1]:smtp                                                                                                                                        [::]:*
[root@CentOS7 etc]# systemctl stop telnet

スーパーサーバーinited/xinetd

  • ネットワークを通じてサービスを提供しているサーバーは、デーモンと呼ばれる常駐プログラム

  • 常駐するデーモンの数が多いほどシステムリソース消費する

  • これを解決するために、スーパーサーバー(inetd、xinetd)がある。
    他のサーバープログラムに代わって、サービスを監視し、接続が確立した時点で本来のサーバープログラムに要求を引き渡す。
    ただ、最近のディストリビューションではsystemdが管理している。

ファイヤウォール 

  • Linuxのカーネルには、Netfilterというパケットフィルタリング機能がある。

  • 外部からLinux「input」Linuxから外部「output」、別のホストへの転送「foward」がある。

  • 外部から入ってくるパケットを拒否したり許可したり制御できる。

  • 制御コマンドで最も基本的なのがiptables

iptabeles

パケットフィルタリングのルールを細かく設定ができる。
iptables -L 現在のパケットフィルタリングルールを表示。

[root@CentOS7 ken]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ES

firewalld

CentOS7以降では、ファイヤウォールサービスとしてfirewalldが搭載された。
管理コマンドとして、firewall-cmdコマンドを使う。
firewalldには、ゾーンという概念がある。
ゾーンは、パケットフィルタリングのルールをまとめたもの。

firewall-cmd --state ファイアウォールが動作しているか確認

[root@CentOS7 ken]# firewall-cmd --state
running

ゾーン一覧

public...公共領域での利用(デフォルト)
work...業務での利用
home...家庭での利用
internal...ファイアウォールの内部ネットワーク側での利用
external...ファイアウォールの外部ネットワーク側での利用
dmz...ファイアウォールのDMZ(外部から内部ネットワークを守る緩衝地帯)での利用
block...受信パケットを拒否。外部への通信と戻りパケットだけを許可
drop...受信パケットを廃棄。外部への通信と戻りパケットだけを許可
trusted...全ての通信を許可

firewall-cmd --list-all 指定したゾーンの設定を確認(デフォルトはpublic)

[root@CentOS7 ken]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client http ssh telnet
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

暗号化によるデータ保護

OpenSSH

  • リモートホスト間の通信において高いセキュリティを実現するプロトコル

  • SSHにはバージョン1と2があり、公開鍵暗号方式の認証アルゴリズムに違いがある

  • バージョン1ではRSA、バージョン2ではDSAおよびRSAが使われている

ssh

ssh -l ユーザ名 IPアドレス

ken@Ubuntu-LInuc:~$ ssh -l ken 192.168.120.1
ken@192.168.120.1's password:
Last login: Fri Aug 11 20:18:14 2023 from 192.168.120.11

ホスト認証

  1. クライアント→サーバ SSH接続を試みる

  2. サーバ→クライアント 公開鍵を送付

  3. クライアント 保存している公開鍵と送られてきた鍵を比較して一致するか確認

公開鍵認証

  1. クライアント ユーザー公開鍵と秘密鍵を作成 
    ユーザの公開鍵をサーバの「~/.ssh/authorized_keys」に登録しておく

  2. クライアント→サーバ 公開鍵をサーバに登録

  3. クライアント→サーバ 公開鍵が使えるか確認

  4. クライアント→サーバ クライアント側で秘密鍵を使ってデータ署名してサーバに送付

  5. サーバ クライアントから送られてきた署名を公開鍵を使って検証

  6. サーバ OKならサーバへのログインを許可

ssh-keyegen -t ed25519 鍵を作成

[ken@CentOS7 ~]$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ken/.ssh/id_ed25519):
Created directory '/home/ken/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ken/.ssh/id_ed25519.
Your public key has been saved in /home/ken/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:c0hc2VCLPTaJaI0fURwFLLmqTEJ88bR8qbSrKNmqSq4 ken@CentOS7
The key's randomart image is:
+--[ED25519 256]--+
|          +X=+.  |
|      ...==++o   |
|   .   .=*.=+B    |
|    o.o=o+oo .   |
|   . . .S=o      |
|    . . +o       |
| . o + . .       |
|o o .o .        |
|Eo.o. ..         |
+----[SHA256]-----+

サーバへ鍵を登録

[ken@CentOS7 ~]$ ssh-copy-id -i ~/.ssh/id_rsa.pub  [リモートユーザー]@[リモートサーバーのホスト名]

サーバへログイン

ssh -i id_rsa.pub [リモートユーザー]@[リモートサーバーのホスト名]

SCP

ローカルホストにあるファイルをリモートホストにコピーするコマンド。

ken@Ubuntu-LInuc:~$ scp test-memo ken@192.168.100.9:/tmp
ken@192.168.100.9's password:
test-memo                                     100%    0     0.0KB/s   00:00

リモートホストで確認すると・・・

[ken@CentOS7 tmp]$ ls
systemd-private-91adc756669c4c139d583b61ccee6480-chronyd.service-3pkODI
systemd-private-91adc756669c4c139d583b61ccee6440-cups.service-UEZ5ni
test-memo

gpg

gpgコマンドはGnuPGという暗号化プログラムを使用して、ファイルの暗号化や復号をする。

SSHポート転送(ポートフォワーディング)

あるポートに送られてきたTCPパケットを、SSHを使った安全な通信経路を経由して、リモートホストの任意のポートに転送する。
この機能を利用すれば、POP3やFTPといった暗号化されていないプロトコル通信の安全性を高められる。

クラウドセキュリティの基礎

クラウドはサービスを立ち上げるのが楽だけど、クラウドならではのセキュリティには気を付けなければならない。

パブリッククラウド

  • 近年、サーバが必要な時にはパブリッククラウドが利用することが多くなった。

  • パブリッククラウドでよく利用されるのは、AWS、GCP、Azureなどがある。

  • クラウド内で動作するサーバをインスタンスとよぶ。

パブリッククラウドの種類と責任範囲

  • Iaas(Infrastucture as Service)
    クラウド事業者がハードやネットワークといったインフラを容易と、仮想マシンで利用できるOSイメージまで提供してくれる。
    ユーザは仮想マシン上にOSとアプリケーションをデプロイすればよい。

  • Paas
    クラウド事業者がアプリケーションの利用環境まで提供する。

  • Saas
    クラウド事業者がアプリケーションそのものを提供してくれる。

この記事が気に入ったらサポートをしてみませんか?