paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pythonのipaddressモジュールでサブネット計算して全部のアドレスを出す

IPアドレスをデータベースで管理したいという思いがあるのですが、
table作成の練習として特定のサブネットのレンジを出力させてみようと思います。

コード

出番が多くてもいいように引数から読み込むようにしました。

  • create_subnet.py
import ipaddress
import sys

if len(sys.argv) != 2:
    print('Usage: python3 ', sys.argv[0], ' <ipaddress/prefix>')
    exit()

Address = sys.argv[1]

def Create_segment(cider):
    # Convet to Network address with strict
    Segment = ipaddress.IPv4Network(cider, strict=False)
    Hosts = Segment.hosts()
    Mask = Segment.netmask

    if Segment.prefixlen == 32:
        print(Segment.network_address, Mask)
    elif Segment.prefixlen == 31:
        print(Segment.network_address, Mask, 'Network Address')
        print(Segment.broadcast_address, Mask, 'Broadcast Address')
    else:
        print(Segment.network_address, Mask, 'Network Address')
        for IP in Hosts:
            print(IP, Mask, 'Usable host')
        print(Segment.broadcast_address, Mask, 'Broadcast Address')

if __name__ == '__main__':
    Create_segment(Address)

環境

WindowsサブノートPCで動かします。

PS C:\Users\masashi\tools\ipaddresses> Get-WmiObject Win32_OperatingSystem


SystemDirectory : C:\WINDOWS\system32
Organization    :
BuildNumber     : 18363
RegisteredUser  : user
SerialNumber    : 00330-80000-00000-AA868
Version         : 10.0.18363


PS C:\Users\masashi\tools\ipaddresses> python --version
Python 3.7.2

動作

CIDER表記でIPアドレスを入力するとネットワークアドレスを拾って
サブネット分のアドレスを出力してくれます。

  • 今のアドレス
Wireless LAN adapter Wi-Fi:

…
   リンクローカル IPv6 アドレス. . . . .: fe80::fc0c:5db:ec24:8ed1%19
   IPv4 アドレス . . . . . . . . . . . .: 192.168.0.12
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 192.168.0.1
PS C:\Users\masashi\tools\ipaddresses> python .\create_subnet.py 192.168.0.12/24
192.168.0.0 255.255.255.0 Network Address
192.168.0.1 255.255.255.0 Usable host
192.168.0.2 255.255.255.0 Usable host
192.168.0.3 255.255.255.0 Usable host
192.168.0.4 255.255.255.0 Usable host
192.168.0.5 255.255.255.0 Usable host
192.168.0.6 255.255.255.0 Usable host
192.168.0.7 255.255.255.0 Usable host
…
192.168.0.250 255.255.255.0 Usable host
192.168.0.251 255.255.255.0 Usable host
192.168.0.252 255.255.255.0 Usable host
192.168.0.253 255.255.255.0 Usable host
192.168.0.254 255.255.255.0 Usable host
192.168.0.255 255.255.255.0 Broadcast Address
PS C:\Users\masashi\tools\ipaddresses>
  • 29bit
PS C:\Users\masashi\tools\ipaddresses> python .\create_subnet.py 192.168.0.12/29
192.168.0.8 255.255.255.248 Network Address
192.168.0.9 255.255.255.248 Usable host
192.168.0.10 255.255.255.248 Usable host
192.168.0.11 255.255.255.248 Usable host
192.168.0.12 255.255.255.248 Usable host
192.168.0.13 255.255.255.248 Usable host
192.168.0.14 255.255.255.248 Usable host
192.168.0.15 255.255.255.248 Broadcast Address
PS C:\Users\masashi\tools\ipaddresses>
  • 30bit
PS C:\Users\masashi\tools\ipaddresses> python .\create_subnet.py 192.168.0.12/30
192.168.0.12 255.255.255.252 Network Address
192.168.0.13 255.255.255.252 Usable host
192.168.0.14 255.255.255.252 Usable host
192.168.0.15 255.255.255.252 Broadcast Address
PS C:\Users\masashi\tools\ipaddresses>
  • 31bit
PS C:\Users\masashi\tools\ipaddresses> python .\create_subnet.py 192.168.0.12/31
192.168.0.12 255.255.255.254 Network Address
192.168.0.13 255.255.255.254 Broadcast Address
PS C:\Users\masashi\tools\ipaddresses>
  • 32bit
PS C:\Users\masashi\tools\ipaddresses> python .\create_subnet.py 192.168.0.12/32
192.168.0.12 255.255.255.255

細かいサブネットもこの通り。

これの気に入っているところはわざわざネットワークアドレスを計算して指定しなくても
モジュールが探し出してくれるのですごく楽です。

こりゃ暗記するのがバカらしくなるぜ!

コード振り返り

ipaddressモジュールって似た機能のクラスがあってまぎらわしいです。

IPv4Interfaceをよく使うのですが
今回はネットワークを出すツールなのでIPv4Networkで統一しました。
IPv4Interfaceはホスト単位で細かく操作できるイメージです。

また、hostsメソッドは有効なアドレスしか出力しないので、
サブネットらしく別でネットワークアドレスとブロードキャストアドレスを出してます。
31bitと32bitのときはIPv4Networkで処理しきれないので切り出してます。

あと引数チェックで失敗したら抜けるという処理を入れたら
このスクリプトをimportできなくなってしまいました。

今は考えていませんが、他のスクリプトから読み込ませる際は
引数チェックを読ませないようにしないとですね。

というわけで簡単なコードですが指定したIPのサブネットを丸ごと出力できるようになりました。
細かいサブネットも業務で使うことがあるのでこいつでサクッと計算しようと思います。

ipcalcより一歩先行く(?)ツールが作れましたw

これも改めてgithubに上げたいと思います。

追記

これでリポジトリ作りました!

github.com

参考サイト

少しバージョンが違いますが
ipaddress --- IPv4/IPv6 操作ライブラリ — Python 3.7.7 ドキュメント

Containerでtls webサーバを作る nginx(tls1.3)編

今回はtls1.3サーバのコンテナを作ります。
これもnginxです。

くどいですが環境。

f:id:paloma69:20200227233607p:plain

nginxのbuild

パッケージ版のnginxはまだtls1.3に対応していないのでSourceからコンパイルします。
nginxというかopensslのほうですね。

makeとか久しぶりに叩きます。

各Source

  • ドキュメント

Building nginx from Sources

必要なSourceをダウンロードして展開しておきます。
各URLは割愛。

今回も/root直下でやっちゃいます。

[root@tls1-3 ~]# ls -d */
nginx-1.17.8/  openssl-1.1.1d/  pcre-8.42/  zlib-1.2.11/

簡単なメモ。

makeします

nginxのディレクトリに移動してconfigure。

[root@tls1-3 nginx-1.17.8]# ./configure --prefix=/etc/nginx \
>   --user=nginx --group=nginx \
>   --with-threads --with-http_ssl_module --with-http_v2_module \
>   --with-openssl=/root/openssl-1.1.1d \
>   --with-openssl-opt=enable-tls1_3 \
>   --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11

設定具合をパッケージ版に寄せたかったので/etc配下にインストールします。
しかしこれだけだとnginxの環境が全部/etcに入ってしまいます。
binだlogだなんかも寄せるなら相当なチューニングが必要ですね。

この手順をどこから拾ってきたものか忘れてしまいましたが、
--with-openssl-opt=enable-tls1_3を指定するのがミソですね。
あと、../openssl-1.1.1dでよかったのに何でフルパスにしたんだっけ…?

configureが完了したらmakeします。

[root@tls1-3 nginx-1.17.8]# make
make -f objs/Makefile
make[1]: Entering directory `/root/nginx-1.17.8'


opensslまわりのコンパイルがメチャ長いです。

make完了したらインストールします。

[root@tls1-3 nginx-1.17.8]# make install
make -f objs/Makefile install
make[1]: Entering directory `/root/nginx-1.17.8'
test -d '/etc/nginx' || mkdir -p '/etc/nginx'


証明書の移動

作っておいた証明書をホスト経由でコンテナに移動します。

vagrant@ubuntu-bionic:~$ sudo lxc file push tls13.cert tls1-3/root/
vagrant@ubuntu-bionic:~$ sudo lxc file push tls13.key tls1-3/root/

この証明書はcpで無理やりコンテナディレクトリに持っていったら
所属ユーザが変になり気持ち悪かったのでlxcコマンド経由で移動させました。
これだとちゃんとrootユーザで移動できました。

(cpでやるとユーザが数字になってしまった)

-rw-r--r--  1 65534 65534    4513 Feb 24 07:42 tls13.cert
-rw-r--r--  1 65534 65534    1834 Feb 24 07:42 tls13.key

nginxの設定

パッケージ版とディレクトリ構成が違います。
今回はnginx.conf無いにtlsの設定を書いてしまいます。
tls1.3のみ使うようにします。

[root@tls1-3 conf]# diff -u nginx.conf.default nginx.conf
--- nginx.conf.default  2020-02-24 07:28:27.129942631 +0000
+++ nginx.conf  2020-02-24 07:56:34.217942631 +0000
@@ -95,23 +95,24 @@

     # HTTPS server
     #
-    #server {
-    #    listen       443 ssl;
-    #    server_name  localhost;
-
-    #    ssl_certificate      cert.pem;
-    #    ssl_certificate_key  cert.key;
+    server {
+        listen       443 ssl;
+        server_name  tls1-3.vagrant.lab;
+
+        ssl_certificate      /root/tls13.cert;
+        ssl_certificate_key  /root/tls13.key;
+       ssl_protocols           TLSv1.3;

     #    ssl_session_cache    shared:SSL:1m;
     #    ssl_session_timeout  5m;

-    #    ssl_ciphers  HIGH:!aNULL:!MD5;
-    #    ssl_prefer_server_ciphers  on;
+        ssl_ciphers  HIGH:!aNULL:!MD5;
+        ssl_prefer_server_ciphers  on;

-    #    location / {
-    #        root   html;
-    #        index  index.html index.htm;
-    #    }
-    #}
+        location / {
+            root   html;
+            index  index.html index.htm;
+        }
+    }

 }

サービス起動

起動の前にconfigチェック。

スクリプト系はsbin内にあります。

[root@tls1-3 nginx]# ls -ld $(pwd)/*
drwx------ 2 nginx root 4096 Feb 24 07:33 /etc/nginx/client_body_temp
drwxr-xr-x 2 root  root 4096 Feb 24 07:56 /etc/nginx/conf
drwx------ 2 nginx root 4096 Feb 24 07:33 /etc/nginx/fastcgi_temp
drwxr-xr-x 2 root  root 4096 Feb 24 06:59 /etc/nginx/html
drwxr-xr-x 2 root  root 4096 Feb 24 07:53 /etc/nginx/logs
drwx------ 2 nginx root 4096 Feb 24 07:33 /etc/nginx/proxy_temp
drwxr-xr-x 2 root  root 4096 Feb 24 07:28 /etc/nginx/sbin
drwx------ 2 nginx root 4096 Feb 24 07:33 /etc/nginx/scgi_temp
drwx------ 2 nginx root 4096 Feb 24 07:33 /etc/nginx/uwsgi_temp
  • config確認
[root@tls1-3 nginx]# sbin/nginx -t
nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful

今回はserver nameのwarningが出てませんね。
どこの設定なんだろうか…。

  • サービス起動

一応フルパスでサービスを起動します。
-cで読み込むconfigを指定して起動ですね。

/etc/nginx/sbin/nginx -c /etc/nginx/conf/nginx.conf

これをsystemd経由でするにはどうするんだろ?
分からないことがどんどん出てきます。

  • ローカルアクセス

tls1.3指定で無事に見れました。

[root@tls1-3 nginx]# curl -k  https://localhost --tlsv1.3
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

ホストからアクセス

ホストからcurlでアクセス。

vagrant@ubuntu-bionic:~$ curl -Iv --cacert cacert.pem https://tls1-3.vagrant.lab --tlsv1.3
* Rebuilt URL to: https://tls1-3.vagrant.lab/
*   Trying 10.26.247.53...
* TCP_NODELAY set
* Connected to tls1-3.vagrant.lab (10.26.247.53) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: cacert.pem
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Client hello (1):
* TLSv1.3 (OUT), TLS Unknown, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=JP; ST=XXXX; L=XXXX-Shi; O=XXXX; OU=labo; CN=tls1-3.vagrant.lab
*  start date: Feb 24 07:40:57 2020 GMT
*  expire date: Feb 23 07:40:57 2021 GMT
*  common name: tls1-3.vagrant.lab (matched)
*  issuer: C=JP; ST=XXXX; O=XXXX; OU=labo; CN=masashi.lab
*  SSL certificate verify ok.
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
> HEAD / HTTP/1.1

ちゃんとtls1.3使ってますね。

tls1.2以下はnginxに設定していなのでハンドシェイク失敗します。

vagrant@ubuntu-bionic:~$ curl -Iv --cacert cacert.pem https://tls1-3.vagrant.lab --tlsv1.2
* Rebuilt URL to: https://tls1-3.vagrant.lab/
*   Trying 10.26.247.53...
* TCP_NODELAY set
* Connected to tls1-3.vagrant.lab (10.26.247.53) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: cacert.pem
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS alert, Server hello (2):
* error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version
* stopped the pause stream!
* Closing connection 0
curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version

むすび

4回にわたってtls1.2,1.3周りのフロー確認、環境構築の備忘でした。
文字に起こしてみると結構多くの手順を踏んだもんですね。

しかしvagrantとLXDのおかげでOS周りの構築に手を取られることなく
すんなりtlsサーバ周りのみの確認ができました。
本当に便利になりましたね。

しかしtls1.3自体の仕様をしっかり把握できていない事が分かったのでまた改めて勉強したいと思います。

本シリーズ

Containerでtls webサーバを作る nginx(tls1.2)編

証明書発行したところでnginxでhttpsサーバを立ち上げます。

何度も載せますが構成図。

f:id:paloma69:20200227233607p:plain

なぜnginxにしたのか

apacheは何度も触っているのでトレンドもと思い、検証内ですが最近はnginxばかり使っています。

また、F5社が買収したと言うことでゆくゆくはLTMにもnginxが入るんではないでしょうか。
BIGIP LTMもよく触るので慣れておきたいですね。
(というかnginxでバランシングすりゃいいとも思いますが)

パッケージインストール

ドキュメントに沿ってインストール。

nginx: Linux packages

[root@tls1-2 ~]# yum install yum-utils
[root@tls1-2 ~]# vi /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[root@tls1-2 ~]# yum-config-manager --enable nginx-mainline
  • インストール
[root@tls1-2 ~]# yum install nginx

ログをよく見たらここでopensslもインストールされるようです。
前回個別にインストールしたかのように書いちゃいました…すみません。

  • バージョン
[root@tls1-2 ~]# nginx -v
nginx version: nginx/1.17.8

tls

conf.d/defaultに直接tls化のパラメータ書きます。
デフォルトのhttpサーバをコメントアウトしてhttps用の設定に書き換える感じです。
これもドキュメント通りのパラメータです。

証明書の場所も指定して完了。

server {
    #listen       80;
    #server_name  localhost;

    listen              443 ssl;
    server_name         tls1-2.masashi.lab;
    ssl_certificate     /root/tls12.cert;
    ssl_certificate_key /root/tls12.key;
    ssl_protocols       TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
  • configテスト

servernameがwarning吐いてますが無視。
ドメインと違うからかな?

[root@tls1-2 ~]# nginx -t
nginx: [warn] conflicting server name "tls1-2.masashi.lab" on 0.0.0.0:443, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • ローカルアクセス
[root@tls1-2 ~]# curl -k https://localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

見えたのでOK!

ホストからアクセス

キャプチャ取るのにローカルアクセスだと気分出ないのでホストからアクセスします。

CA証明書指定してアクセス

せっかく認証局から作ったので無視してアクセスするのは勿体ないです。

CA証明書はホストのhome(vagrantユーザ)に用意します。
ログを見たらコンテナディレクトリから無理やり持ってきていました。
この手順はあんまりよろしくなくてちゃんとコマンドがありますので次回書きます。

vagrant@ubuntu-bionic:~$ sudo cp /var/lib/lxd/containers/tls1-2/rootfs/etc/pki/CA/cacert.pem .
/home/vagrant/cacert.pem

hostsにcommon nameもちゃんと書いてcurlでアクセス。
curlはminimalでも入っているのにいろいろできて便利です。
愛用してます。

vagrant@ubuntu-bionic:~$ curl --cacert cacert.pem https://tls1-2.vagrant.lab
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

OK!
初回でも見ましたが-vで詳細も見てみます。
長いのでヘッダだけ。

vagrant@ubuntu-bionic:~$ curl -I -v --cacert cacert.pem https://tls1-2.vagrant.lab
* Rebuilt URL to: https://tls1-2.vagrant.lab/
*   Trying 10.26.247.57...
* TCP_NODELAY set
* Connected to tls1-2.vagrant.lab (10.26.247.57) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: cacert.pem
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=JP; ST=XXXX; L=XXXX-Shi; O=XXXX; OU=labo; CN=tls1-2.vagrant.lab
*  start date: Feb 23 09:49:06 2020 GMT
*  expire date: Feb 22 09:49:06 2021 GMT
*  common name: tls1-2.vagrant.lab (matched)
*  issuer: C=JP; ST=XXXX; O=XXXX; OU=labo; CN=masashi.lab
*  SSL certificate verify ok.
> HEAD / HTTP/1.1

最初は1.3でネゴシエーションかけてますがちゃんとtls1.2で通信してますね。

nginxで有効にしていないので1.3だと弾かれます。

vagrant@ubuntu-bionic:~$ curl -I -v --cacert cacert.pem https://tls1-2.vagrant.lab --tlsv1.3
* Rebuilt URL to: https://tls1-2.vagrant.lab/
*   Trying 10.26.247.57...
* TCP_NODELAY set
* Connected to tls1-2.vagrant.lab (10.26.247.57) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: cacert.pem
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS alert, Server hello (2):
* error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure

というわけでnginxのhttps化(tls1.2)でした。
次回はtls1.3サーバの作成記を書いて本シリーズを終わりにしたいと思います。

Containerでtls webサーバを作る 自己認証局編

前回無事に(?)tls1.3フローの確認が終わったところで環境構築を振り返ります。

環境

今回はコンテナ(LXD)で2サーバ立てるつもりだったのでvagrantubuntuをインストール。
LXDといえばcanonicalなのでトラブルが少ない様ubuntuにしてます。
Dockerにしなかったのは証明書を作る用事もあったので、コンテナ中でいろいろ弄れるように避けました。
また、Dockerのデータ永続化の概念がどうもしっくりこず今だに苦手です。

というかLXDはRHEL系でも使えるんですかね?
今はDockerの方が多いか。

コンテナは一応業務で使うことの多いRHELということでCentOSにしました。

構成は前回も載せましたが下記です。 f:id:paloma69:20200227233607p:plain

tls1.2サーバに認証局も持たせませす。

Centos7コンテナ作成

特に変わったことはせずlxdはinit済みです。

まずはtls1.2用のコンテナを立てます。

vagrant@ubuntu-bionic:~$ sudo lxc launch images:centos/7/amd64 tls1-2
vagrant@ubuntu-bionic:~$ sudo lxc exec tls1-2 -- /bin/bash
[root@tls1-2 ~]#

証明書作成

まずは証明書を作ってしまいます。

opensslインストール

yum install openssl

バージョン

OpenSSL 1.0.2k-fips  26 Jan 2017
証明書作成の難しさ

まだLinux触りたての頃の話ですが、検証等で自己証明書を作るのが難しくて進捗がよくありませんでした。

なぜ難しいか

オプションが豊富!

コマンドだけでやろうとすると引数がめちゃめちゃ多くて有効期限の指定、鍵作成、証明書作成…など
ググっても理解できないことがたくさんありました。

でも数はこなしてみるもんで、基本はopenssl.cnfに書いとけばよかったんですね。

署名書発行のフローも実はシンプルで

  1. 自己CAの作成
  2. 自己証明書要求、秘密鍵作成
  3. CAの署名

これだけ。

しかもopensslにはスクリプトも用意されていたんですね。
今までせっせとコマンド打ってたよ。

/etc/pki/tls/misc/CA というスクリプトをたたけば楽ちんです。

CAスクリプトで証明書作成

Containerなので壊れたら作り直せばいいやで直のディレクトリで作業しちゃいます。
/etc/pki/tlsディレクトリで作業してます。

CA作成
[root@tls1-2 misc]# ./CA -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 2048 bit RSA private key
....................+++
.......................+++
writing new private key to '/etc/pki/CA/private/./cakey.pem'

この後CA局のSubjectを記入して完了。
詳細は隠します。

Subject:
    countryName               = JP
    stateOrProvinceName       = XXXX
    organizationName          = XXXX
    organizationalUnitName    = labo
    commonName                = masashi.lab

openssl.cnfのDAYSのところいじって期限は3年弱ですね。

Certificate is to be certified until Feb 22 09:36:32 2023 GMT (1095 days)
CSR作成

続いてCSRを作ります。

[root@tls1-2 tls]# misc/CA -newreq
Generating a 2048 bit RSA private key
.........................+++
.....................+++
writing new private key to 'newkey.pem'

鍵のパスフレーズの後、証明書用のSubjectを打ち込みます。(詳細は署名のとこで)

署名

署名して完了です。

[root@tls1-2 tls]# misc/CA -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            96:14:48:f6:c7:d3:48:c7
…

サーバ証明書のSubjectはこんな感じ。

Subject:
    countryName               = JP
    stateOrProvinceName       = XXXX
    localityName              = XXXX
    organizationName          = XXXX
    organizationalUnitName    = labo
    commonName                = tls1-2.vagrant.lab

サーバ証明書の項目はいじくらなかったので期限が1年になってしまいました。
まあ検証用だしいいか。
あとは署名の確認をして完了です。

Certificate is to be certified until Feb 22 09:49:06 2021 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

これだけ。

今回は検証用なのでsubject以外は全てデフォルト値です。
(CA証明書の期限は変えましたが)

signまで完了するとnewcert.pemとnewkey.pemが作成されるのでリネームします。
期限含め引数で指定できそうだけど今回はメインの目的ではないのでやってません。

[root@tls1-2 tls]# mv newcert.pem tls12.cert
[root@tls1-2 tls]# mv newkey.pem tls12.key

これを/rootに移動してnginxに読ませます。
本当はもう少し適切なディレクトリに置きたいところです。

あとはサーバに読ませるときにパスワード聞かれないように抜いておきます。
この手間がありますが、コマンドをセコセコ調べずに発行できるので簡単ですね。

[root@tls1-2 ~]# openssl rsa -in tls12.key -out tls12.key
Enter pass phrase for tls12.key:
writing RSA key

というわけでopensslで自己認証局と証明書の発行ができました。
デフォルトの状態の各アルゴリズムにも触れたいところですが今回はここまでにします。

tls1.2と1.3の違いを調べようと思った、けどよくわからなかった

bossからtls1.3勉強しといてと言われたのでちょっと触ってみました。

環境

自宅環境のVMにコンテナでtls1.2と1.3のサーバを立てました。 コンテナにしたのは構築に失敗したら壊してすぐ作り直せるようにです。

f:id:paloma69:20200227233607p:plain

サーバは基本デフォルトのパラメータです。
詳細は後日書こうと思います。

  • バージョン等
vagrant@ubuntu-bionic:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.4 LTS"
vagrant@ubuntu-bionic:~$
vagrant@ubuntu-bionic:~$ lxc --version
3.0.3
vagrant@ubuntu-bionic:~$ sudo lxc list
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+
|  NAME  |  STATE  |        IPV4         |                     IPV6                      |    TYPE    | SNAPSHOTS |
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+
| tls1-2 | RUNNING | 10.26.247.57 (eth0) | fd42:a221:114c:4ccf:216:3eff:fe28:3f6e (eth0) | PERSISTENT | 0         |
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+
| tls1-3 | RUNNING | 10.26.247.53 (eth0) | fd42:a221:114c:4ccf:216:3eff:fec7:2a5e (eth0) | PERSISTENT | 0         |
+--------+---------+---------------------+-----------------------------------------------+------------+-----------+

tls1.2と1.3の違い

アルゴリズムとかハンドシェイクとかガラッと変わったようです。 RFCは読めていないので細かいところは参考サイトを参照ください。

www.wolfssl.jp

products.nvc.co.jp

Server Hello以降は暗号化というところだけ覚えましたw

実際にアウトプットを見よう

ホストから各コンテナへの通信を見てみます。 curlで叩いてみます。

パケットフロー

ホストでtcpdumpを仕掛けてcurlの結果を取りました。
後学のためにローカルPCに持ってきてWireshekで確認します。

といってもフローだけなんでtsharkで確認します。
ホストもサービスも名前引き無効にしてあります。

  • tls1.2

よく見るTLSのフローですね。

PS C:\Users\masashi\tools\vagrant\ubuntu> & 'C:\Program Files\Wireshark\tshark.exe' -t ad -r .\tls1-2.pcap
    1 2020-02-27 22:44:32.511597  10.26.247.110.26.247.57 TCP 74 41712443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2750354114 TSecr=0 WS=128
    2 2020-02-27 22:44:32.511637 10.26.247.5710.26.247.1  TCP 74 44341712 [SYN, ACK] Seq=0 Ack=1 Win=65160 Len=0 MSS=1460 SACK_PERM=1 TSval=2630713681 TSecr=2750354114 WS=128
    3 2020-02-27 22:44:32.511676  10.26.247.110.26.247.57 TCP 66 41712443 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=2750354114 TSecr=2630713681
    4 2020-02-27 22:44:32.514209  10.26.247.110.26.247.57 TLSv1 305 Client Hello
    5 2020-02-27 22:44:32.514223 10.26.247.5710.26.247.1  TCP 66 44341712 [ACK] Seq=1 Ack=240 Win=65024 Len=0 TSval=2630713684 TSecr=2750354117
    6 2020-02-27 22:44:32.515992 10.26.247.5710.26.247.1  TLSv1.2 1508 Server Hello, Certificate, Server Key Exchange, Server Hello Done
    7 2020-02-27 22:44:32.516031  10.26.247.110.26.247.57 TCP 66 41712443 [ACK] Seq=240 Ack=1443 Win=62848 Len=0 TSval=2750354118 TSecr=2630713685
    8 2020-02-27 22:44:32.517143  10.26.247.110.26.247.57 TLSv1.2 192 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message
    9 2020-02-27 22:44:32.517521 10.26.247.5710.26.247.1  TLSv1.2 117 Change Cipher Spec, Encrypted Handshake Message
   10 2020-02-27 22:44:32.517726  10.26.247.110.26.247.57 TLSv1.2 178 Application Data
   11 2020-02-27 22:44:32.517852 10.26.247.5710.26.247.1  TLSv1.2 333 Application Data
   12 2020-02-27 22:44:32.524781  10.26.247.110.26.247.57 TLSv1.2 97 Encrypted Alert
   13 2020-02-27 22:44:32.524884 10.26.247.5710.26.247.1  TCP 66 44341712 [FIN, ACK] Seq=1761 Ack=509 Win=65024 Len=0 TSval=2630713694 TSecr=2750354127
   14 2020-02-27 22:44:32.524994  10.26.247.110.26.247.57 TCP 66 41712443 [FIN, ACK] Seq=509 Ack=1762 Win=64128 Len=0 TSval=2750354127 TSecr=2630713694
   15 2020-02-27 22:44:32.525005 10.26.247.5710.26.247.1  TCP 66 44341712 [ACK] Seq=1762 Ack=510 Win=65024 Len=0 TSval=2630713694 TSecr=2750354127
  • tls1.3

6行目、Chenge Cipher SpecのあとからApplication Dataになってます。
なるほど、確かに早いフェーズで暗号化されているようですね。

PS C:\Users\masashi\tools\vagrant\ubuntu> & 'C:\Program Files\Wireshark\tshark.exe' -t ad -r .\tls1-3.pcap
    1 2020-02-27 22:44:59.110859  10.26.247.110.26.247.53 TCP 74 44406443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=2995470197 TSecr=0 WS=128
    2 2020-02-27 22:44:59.110903 10.26.247.5310.26.247.1  TCP 74 44344406 [SYN, ACK] Seq=0 Ack=1 Win=65160 Len=0 MSS=1460 SACK_PERM=1 TSval=1922381237 TSecr=2995470197 WS=128
    3 2020-02-27 22:44:59.110951  10.26.247.110.26.247.53 TCP 66 44406443 [ACK] Seq=1 Ack=1 Win=64256 Len=0 TSval=2995470197 TSecr=1922381237
    4 2020-02-27 22:44:59.115120  10.26.247.110.26.247.53 TLSv1 326 Client Hello
    5 2020-02-27 22:44:59.115146 10.26.247.5310.26.247.1  TCP 66 44344406 [ACK] Seq=1 Ack=261 Win=65024 Len=0 TSval=1922381242 TSecr=2995470201
    6 2020-02-27 22:44:59.116893 10.26.247.5310.26.247.1  TLSv1.3 1608 Server Hello, Change Cipher Spec, Application Data, Application Data, Application Data, Application Data
    7 2020-02-27 22:44:59.116907  10.26.247.110.26.247.53 TCP 66 44406443 [ACK] Seq=261 Ack=1543 Win=64128 Len=0 TSval=2995470203 TSecr=1922381243
    8 2020-02-27 22:44:59.118206  10.26.247.110.26.247.53 TLSv1.3 146 Change Cipher Spec, Application Data
    9 2020-02-27 22:44:59.118409  10.26.247.110.26.247.53 TLSv1.3 171 Application Data
   10 2020-02-27 22:44:59.118552 10.26.247.5310.26.247.1  TLSv1.3 369 Application Data
   11 2020-02-27 22:44:59.118705 10.26.247.5310.26.247.1  TLSv1.3 369 Application Data
   12 2020-02-27 22:44:59.118776  10.26.247.110.26.247.53 TCP 66 44406443 [ACK] Seq=446 Ack=2149 Win=64128 Len=0 TSval=2995470205 TSecr=1922381245
   13 2020-02-27 22:44:59.118871 10.26.247.5310.26.247.1  TLSv1.3 326 Application Data
   14 2020-02-27 22:44:59.119097  10.26.247.110.26.247.53 TLSv1.3 90 Application Data
   15 2020-02-27 22:44:59.119181  10.26.247.110.26.247.53 TCP 66 44406443 [FIN, ACK] Seq=470 Ack=2409 Win=64128 Len=0 TSval=2995470206 TSecr=1922381245
   16 2020-02-27 22:44:59.135002  10.26.247.110.26.247.53 TCP 66 [TCP Retransmission] 44406443 [FIN, ACK] Seq=470 Ack=2409 Win=64128 Len=0 TSval=2995470221 TSecr=1922381245
   17 2020-02-27 22:44:59.135160 10.26.247.5310.26.247.1  TCP 78 44344406 [ACK] Seq=2409 Ack=471 Win=64896 Len=0 TSval=1922381262 TSecr=2995470205 SLE=470 SRE=471
   18 2020-02-27 22:44:59.185832 10.26.247.5310.26.247.1  TCP 66 44344406 [FIN, ACK] Seq=2409 Ack=471 Win=64896 Len=0 TSval=1922381312 TSecr=2995470205
   19 2020-02-27 22:44:59.185904  10.26.247.110.26.247.53 TCP 66 44406443 [ACK] Seq=471 Ack=2410 Win=64128 Len=0 TSval=2995470272 TSecr=1922381312

curl

コンテンツはデフォルトページしか置いてないのでHEADで確認します。
一応-vで詳細も。
ちゃんとCA局も作ったのでCA証明書も読み込みます。
自己証明書ちゃんとSubject書いたので一応住所等隠します。

ちょっと長くなるのでサーバからHEADが返るまでを抽出します。

  • tls1.2
vagrant@ubuntu-bionic:~$ curl -I -v -s --cacert cacert.pem https://tls1-2.vagrant.lab --tlsv1.2
* Rebuilt URL to: https://tls1-2.vagrant.lab/
*   Trying 10.26.247.57...
* TCP_NODELAY set
* Connected to tls1-2.vagrant.lab (10.26.247.57) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: cacert.pem
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=JP; ST=XXXX; L=XXXX-Shi; O=XXXX; OU=labo; CN=tls1-2.vagrant.lab
*  start date: Feb 23 09:49:06 2020 GMT
*  expire date: Feb 22 09:49:06 2021 GMT
*  common name: tls1-2.vagrant.lab (matched)
*  issuer: C=JP; ST=XXXX; O=XXXX; OU=labo; CN=masashi.lab
*  SSL certificate verify ok.
> HEAD / HTTP/1.1
> Host: tls1-2.vagrant.lab
> User-Agent: curl/7.58.0
> Accept: */*
>
< HTTP/1.1 200 OK
  • tls1.3

opensslコマンドでも出力ががっつり違います。

vagrant@ubuntu-bionic:~$ curl -I -v -s --cacert cacert.pem https://tls1-3.vagrant.lab --tlsv1.3
* Rebuilt URL to: https://tls1-3.vagrant.lab/
*   Trying 10.26.247.53...
* TCP_NODELAY set
* Connected to tls1-3.vagrant.lab (10.26.247.53) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: cacert.pem
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Unknown (8):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Client hello (1):
* TLSv1.3 (OUT), TLS Unknown, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: C=JP; ST=XXXX; L=XXXX-Shi; O=XXXX; OU=labo; CN=tls1-3.vagrant.lab
*  start date: Feb 24 07:40:57 2020 GMT
*  expire date: Feb 23 07:40:57 2021 GMT
*  common name: tls1-3.vagrant.lab (matched)
*  issuer: C=JP; ST=XXXX; O=XXXX; OU=labo; CN=masashi.lab
*  SSL certificate verify ok.
* TLSv1.3 (OUT), TLS Unknown, Unknown (23):
> HEAD / HTTP/1.1
> Host: tls1-3.vagrant.lab
> User-Agent: curl/7.58.0
> Accept: */*
>
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS Unknown, Unknown (23):
< HTTP/1.1 200 OK

openssl

opensslでも動きを見てみます。
これも長いので証明書の出力が終わってからセッションチケットの前まで切り出します。

見てみるとは言いましたが、久しぶりにTLS周り触ったのでここまでくるともう語れません…

  • tls1.2
vagrant@ubuntu-bionic:~$ openssl s_client -connect tls1-2.vagrant.lab:443 < /dev/null

…

No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1657 bytes and written 446 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 19240C3640E7DA207845593E7E385F87FD52D11704BDED285BEBAD1A617CAC71
    Session-ID-ctx:
    Master-Key: 57637D21DB43586B74829F55977F0712F46E9D17DB804271535CBE9AF3D55C4FF5252A1AADD5B625FA6FF9B5085CF9C2
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:

…
  • tls1.3
vagrant@ubuntu-bionic:~$ openssl s_client -connect tls1-3.vagrant.lab:443 < /dev/null

…

No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 1527 bytes and written 400 bytes
Verification error: unable to verify the first certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 21 (unable to verify the first certificate)
---
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: 6F61CBF0B3482E50F00FD12E49E8A8CFA0ECC699B82F3256D97410EDBC0E5EDA
    Session-ID-ctx:
    Resumption PSK: BE63E7454914EC023103C2F3C6E6B41B8294D23A5A4C15B2866F706839D93E428B41D99AEAAEED930BFC9C97B6C47870
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:

…

結論

フローはわかったが詳細がよくわかりません!

セキュリティの世界は広くて深い魔界の分野の認識ですが、
本件についてもパケットのフローを見るだけで精一杯でした。
本当は仕様アルゴリズムの詳細とか0-RTTの動きとかまで見て記事書けたらと考えていたんですが、
とてもじゃないですが永遠に公開できないと思ったので
恥ずかしながらいったん結果のみ書くだけにしておきます。

先ほどの参考サイト・RFCを読み込まないといけませんが、
その前に暗号化入門読み直しですね。
(第3版まだ見てないし)

悔しいので本件は調べなおしてリベンジしたいですね。

Color ToolsでPowerShellのカラーを変更する

簡単な検証をvagrantでちょこちょこやるのですが、
PowerShellにもsshが入ってわざわざクライアントソフトを入れなくてもよくなりました。

vagrant sshで一発ログインなのですが、PowerShellのデフォルトのカラーは見づらいですよね。
なのでカラーを変更して他のターミナルソフトみたいに変更しようと思います。

MacLinuxでやれば解決なのですが、昔買った持ち運びに便利なノートPC(Windows)を愛用してます。

デフォルトはこんな感じ

vagrant upしてログインしたところなんですが、
ディレクトリ、シンボリックリンクが青系統で見づらくなってます。

f:id:paloma69:20200223165624p:plain

Color Tools

もちろんPowerShellのプロパティからカラー変更可能なんですが、それでは面白くありません。

コマンドで変更できないかなーと思って探していたんですが、
Microsoftが作った専用ツールがあるようです。

ダウンロードしたzipファイルを解凍してディレクトリ内でコマンド叩くだけです。
簡単そうなのでこれを使おうと思います。

デフォルトで入っているスキームはこんな感じ。

PS C:\Users\masashi\Downloads\ColorTool> ls .\schemes\


    ディレクトリ: C:\Users\masashi\Downloads\ColorTool\schemes


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018/04/26      5:31            441 campbell-legacy.ini
-a----       2018/04/26      5:31            746 campbell.ini
-a----       2018/04/26      5:31            454 cmd-legacy.ini
-a----       2018/04/26      5:31           7617 deuteranopia.itermcolors
-a----       2018/10/03      1:12           9885 OneHalfDark.itermcolors
-a----       2018/04/26      5:31           9837 OneHalfLight.itermcolors
-a----       2018/10/03      1:12           6745 solarized_dark.itermcolors
-a----       2018/04/26      5:31           7873 solarized_light.itermcolors

変更してみる

-bでカレントのプロンプトとデフォルトのスキームが変更できるようです。
私はダーク系が好きなのですが、ハイライトもいい感じのOneHarkDarkにしました。

また、最新バージョンを落としたのですが、ファイル名まで指定してあげないと
cound not find or load というエラーが出て反映されませんでした。

PS C:\Users\masashi\tools\ColorTool> .\ColorTool.exe -b .\schemes\OneHalfDark.itermcolors
Wrote selected scheme to the defaults.

実写はこんな感じ。

f:id:paloma69:20200223165842p:plain

…が別のターミナルを立ち上げてもいつもの青色に戻ってしまいました。
管理者権限とかで実行する必要があるんでしょうか?

とりあえず今は都度実行する運用でしのぎます。

vagrant再ログイン

ターミナルソフトっぽくなりましたね。
見やすいです。

f:id:paloma69:20200223165914p:plain

というわけでPowerShellのカラー変更でした。

今回は一時的な変更ですが、
Color Toolsで永続的に変更できる方法が見つかればまた書きたいと思います。

参考サイト

rpm版ipcalcのパッケージが判明した

以前のipcalcのエントリですがパッケージの所在を発見しました!

環境

CentOS7系です。

[vagrant@ppp-server ~]$ cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core)
[vagrant@ppp-server ~]$ uname -a Linux ppp-server 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

rpmは便利だな

-fオプションでコマンドからパッケージ引けるんですね。こりゃ知らなかった。

[vagrant@ppp-client ~]$ rpm -qf /usr/bin/ipcalc
initscripts-9.49.46-1.el7.x86_64

initscriptsパッケージとは

名前からして最初にインストールされそうなパッケージですが、
Description見るとnetwork interface周りのコマンド群っぽいですね。
cent7にはいっていたのは9.49でした。
ifup,downのコマンドもありますね。

この辺はパッケージの一部でNetwork initscriptと呼ばれるみたいです。
NetworkManagerに置き換わっていくらしくゆくゆくは無くなってしまうそうです。
私もNetworkManagerの方使ってますが...

access.redhat.com

RHEL 7 における Network Initscript と NetworkManager の違い - Red Hat Customer Portal

RPM RedHat EL 7 initscripts 9.49.17 x86_64 rpm

インストール日時を見ると他の基本的なコマンドっぽいと一緒にインストールされています。
--lastオプションは昔Linux詳しい同僚に教えてもらいました。
パッケージの依存関係も調べるのに使ってました。
(と思ったら-Rで依存パッケージ取れるじゃん)

このサーバはvagrantでつくったんですがbox作った日が登録されてるのかな。
initした日は2019の10月なので。

[vagrant@ppp-client ~]$ rpm -qa --last | grep -A 5 -B 5 initscripts
avahi-libs-0.6.31-19.el7.x86_64               Sat 01 Jun 2019 05:14:55 PM UTC
os-prober-1.58-9.el7.x86_64                   Sat 01 Jun 2019 05:14:54 PM UTC
crontabs-1.11-6.20121102git.el7.noarch        Sat 01 Jun 2019 05:14:54 PM UTC
cronie-1.4.11-20.el7_6.x86_64                 Sat 01 Jun 2019 05:14:54 PM UTC
samba-common-4.8.3-4.el7.noarch               Sat 01 Jun 2019 05:14:53 PM UTC
initscripts-9.49.46-1.el7.x86_64              Sat 01 Jun 2019 05:14:53 PM UTC
cronie-anacron-1.4.11-20.el7_6.x86_64         Sat 01 Jun 2019 05:14:53 PM UTC
rpcbind-0.2.0-47.el7.x86_64                   Sat 01 Jun 2019 05:14:52 PM UTC
policycoreutils-2.5-29.el7_6.1.x86_64         Sat 01 Jun 2019 05:14:52 PM UTC
iputils-20160308-10.el7.x86_64                Sat 01 Jun 2019 05:14:52 PM UTC
hwdata-0.252-9.1.el7.x86_64                   Sat 01 Jun 2019 05:14:51 PM UTC

anacondaファイルから何か詳細がわかるかなと思いましたが、
それらしい表記はわかりませんでした。

ちなみにanacondaファイルのことよくわかってないです。
pythonのAnacondaじゃないことは確かw

これ以上は厳しいです

これ以上の解析はOSのインストールの仕組みとかになってくると思うので今の力では難しいですね。
またレベルアップしたら調べてみたいと思います。