LPIC303 Securityのコマンド整理【sysctl】

# 前書き
アウトプットをしないと、歳のせいか覚えが悪くなった自分がいます💦
書籍を読んだだけで暗記できたあの頃が懐かしい・・・

いい加減本腰をいれて勉強しないといけず（人工知能の力を使いながら）整理していきたいと思います。
~~Security系のコマンド覚えるのむずすぎてイライラが止まらない~~

今回はsysctlコマンドです。

# sysctl 
## 目的
Linuxカーネルのパラメータを動的に調整するためのコマンド
システムの動作やパフォーマンスをカスタマイズする

## オプション
### sysctl -a
説明: 全てのカーネルパラメータとその値を表示します。
```
[root@i-00edb02b7c623d04f ~]# sysctl -a
abi.vsyscall32 = 1
crypto.fips_enabled = 0
crypto.fips_name = Amazon Linux 2023 Kernel Cryptographic API
crypto.fips_version = 6.1.92-99.174.amzn2023.x86_64
debug.exception-trace = 1

中略

vm.user_reserve_kbytes = 29465
vm.vfs_cache_pressure = 100
vm.watermark_boost_factor = 15000
vm.watermark_scale_factor = 10
vm.zone_reclaim_mode = 0
```
#### 重要なsysctl設定項目
1. **ネットワーク関連**
   - `net.ipv4.ip_forward`
     - **説明**: ルーター機能の有効化。
     - **デフォルト値**: 0
   - `net.ipv4.tcp_syncookies`
     - **説明**: SYNフラッド攻撃の防御。
     - **デフォルト値**: 1
   - `net.ipv4.conf.all.rp_filter`
     - **説明**: IPスプーフィング防止。
     - **デフォルト値**: 1

2. **メモリ管理関連**
   - `vm.swappiness`
     - **説明**: スワップ使用頻度の調整。
     - **デフォルト値**: 60
   - `vm.overcommit_memory`
     - **説明**: メモリのオーバーコミット制御。
     - **デフォルト値**: 0
   - `vm.dirty_ratio`
     - **説明**: ディスク書き込み待ちデータの最大割合。
     - **デフォルト値**: 20

3. **ファイルシステム関連**
   - `fs.file-max`
     - **説明**: 同時に開けるファイルの最大数。
     - **デフォルト値**: 8192
   - `fs.inotify.max_user_watches`
     - **説明**: ユーザーごとの最大inotifyウォッチ数。
     - **デフォルト値**: 8192
#### その他
- `kernel.pid_max`
  - **説明**: 最大プロセスID。
  - **デフォルト値**: 32768
- `kernel.sysrq`
  - **説明**: システムリクエストキーの制御。
  - **デフォルト値**: 16

### sysctl -p [file]
説明: 指定されたファイルからカーネルパラメータを読み込みます。デフォルトでは /etc/sysctl.conf ファイルを読み込みます。

って解説を人工知能様からされたのでsysctl.confを確認してみましたが、デフォルトだと説明だけ記載されていてパラメータ的なのは記載されていなさそうですね。。。
```
[root@i-00edb02b7c623d04f ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
```
実際にやってみます。
今回弄るパラメータは影響が少なそうなfs.file-maxを編集していきたいと思います。-pでファイルを指定して実行した後、改めてsysctl -aで設定内容一覧を出力すると、変わっていることがわかりますね。
```
[root@i-00edb02b7c623d04f ~]# sysctl -a | grep -i fs.file-max
fs.file-max = 9223372036854775807
[root@i-00edb02b7c623d04f ~]# vi /etc/sysctl.conf
[root@i-00edb02b7c623d04f ~]# cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
fs.file-max = 100000
[root@i-00edb02b7c623d04f ~]# sysctl -p /etc/sysctl.conf
fs.file-max = 100000
[root@i-00edb02b7c623d04f ~]# sysctl -a | grep -i fs.file-max
fs.file-max = 100000
```

なんで-pなんだろう・・・parameterのpかな・・・
引数でファイルを指定してくるので、-fとかの方が直感的な気がするんですがね・・・

### sysctl -w variable=value
説明: 指定したカーネルパラメータの値を設定します。例えば、sysctl -w net.ipv4.ip_forward=1 のように使用します。

先程設定したものをこのコマンドを使って元に戻してみます。
戻せますね。これもなんで-wなんでしょう？writeかな・・・
```
[root@i-00edb02b7c623d04f ~]# sysctl -w fs.file-max=9223372036854775807
fs.file-max = 9223372036854775807
[root@i-00edb02b7c623d04f ~]# sysctl -a | grep -i fs.file-max
fs.file-max = 9223372036854775807
```

### sysctl variable
説明: 指定したカーネルパラメータの現在の値を表示します。例えば、
sysctl net.ipv4.ip_forward のように使用します。

このコマンドを見る迄は「特定の値を見るのであればgrep -iしないといけないんだ・・・だるいな・・・」とか思っていたのですが、そんなことありませんでした。
```
[root@i-00edb02b7c623d04f ~]# sysctl fs.file-max
fs.file-max = 9223372036854775807
```

### sysctl -e
説明: エラーを無視して続行します。通常、エラーが発生するとコマンドは終了しますが、このオプションを使用すると続行します。

他のオプションと合わせ技で使用するようです。
パラメータがそもそも存在しないものに対して設定を入れようとすると以下のようなエラーを吐いてくるようです。
```
[root@i-00edb02b7c623d04f ~]# sysctl -w fake.parameter=1
sysctl: cannot stat /proc/sys/fake/parameter: No such file or directory
```
-eを併せることで無視することが出来ます。
最も、無視して無いパラメータを新規作成してそこに書き込むという動作をするわけではなく、エラーを表示させずかつ書き込みもしないという感じらしいですね。これは-pに関しても同様の様です。
```
[root@i-00edb02b7c623d04f ~]# sysctl -e -w fake.parameter=1
[root@i-00edb02b7c623d04f ~]# sysctl fake.parameter=1
sysctl: cannot stat /proc/sys/fake/parameter: No such file or directory
```
-eのeはErrorのeでしょうね。これはわかりやすい気がする。。。

### sysctl -q
説明: クワイエットモードで実行し、エラーメッセージを表示しません。

-eと何が違うんだ・・・
と思って実行してみたのですが、しっかりエラー文が表示されているような・・・
```
[root@i-00edb02b7c623d04f ~]# sysctl -q -w fake.parameter=1
sysctl: cannot stat /proc/sys/fake/parameter: No such file or directory
```
# 余談
sysctlで操作しているパラメータは/proc/sysディレクトリ配下でそれぞれ確認することが出来ます。
こちらのファイルを修正することでもパラメータを変更することが出来るようでした。
```
[root@i-00edb02b7c623d04f ~]# cd /proc/sys/
[root@i-00edb02b7c623d04f sys]# ls
abi  crypto  debug  dev  fs  kernel  net  sunrpc  user  vm
[root@i-00edb02b7c623d04f sys]# cd fs/
[root@i-00edb02b7c623d04f fs]# ls
aio-max-nr         epoll     inode-state       mqueue         pipe-user-pages-hard  protected_symlinks
aio-nr             fanotify  inotify           nr_open        pipe-user-pages-soft  quota
binfmt_misc        file-max  lease-break-time  overflowgid    protected_fifos       suid_dumpable
dentry-state       file-nr   leases-enable     overflowuid    protected_hardlinks   xfs
dir-notify-enable  inode-nr  mount-max         pipe-max-size  protected_regular
[root@i-00edb02b7c623d04f fs]# cat file-max
9223372036854775807
```

またこのファイルを直接編集したりsysctl -wでパラメータを変更することは一時的な変更なようで、例えば再起動後もパラメータを維持したい場合は-pを使用して修正するのが良いようです。