オレオレ証明書とnginx

オレオレ証明書は使っていいのか?

  • 暗号化されてるの?
    • 暗号化はされている。しかし、通信相手が、秘密を守ってくれる相手(攻撃者ではない)であることが前提。
  • 使っていいの?
    • 相手の断定は難しい(実在証明が難しい)が使いますか?の答えが答え。

Docker操作とnginx設定

事前確認
docker container run -d -p 8080:80 --name nginx nginx
docker  exec -it  xxxxxxxxxxxxxx /bin/bash
exit
docker stop xxxxxxxxxxxxxx

docker  exec -it  nginx /bin/bash  -c 'ls -1 /etc/nginx/conf.d/*'
docker  exec -it  nginx /bin/bash  -c 'nginx -v'

docker-compose.yml

cat <<'EOF' > docker-compose.yml
version: "3"
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    ports:
      - "8080:80"
      - "8081:443"
    volumes:
      - ./:/etc/nginx/conf.d
EOF

default.conf

cat <<'EOF' > default.conf
server {
    listen 443 ssl;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    
    #ssl on;
    ssl_certificate_key /etc/nginx/conf.d/server.key; # private key
    ssl_certificate     /etc/nginx/conf.d/server.crt; # ore-ore crt
}

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
EOF

docker up

docker compose up -d

curl http://localhost:8080
curl https://localhost:8081

docker restart

docker compose restart

docker down

docker compose down

オレオレ証明書(CRT(SSLサーバー証明書))を作成する。

秘密鍵CSR(証明書署名要求)、CRT(SSLサーバー証明書)作成

秘密鍵を作成した上で、

自分の秘密鍵を用いて証明書署名要求(CSR: Certificate Signing Request)を作成します。

# @ サーバー

# 秘密鍵:pem鍵の保存形式
openssl genrsa -out server.key 2048

# CSR(証明書署名要求):証明書署名リクエスト 証明書持ち主の情報が含まれています。例えば、ドメイン名、国、メールアドレスなど
# 秘密鍵から作成するため本人しか作れない
openssl req -new -key server.key -out server.csr

次に、第三者にお墨付きをもらう。ここでは自分でお墨付きをつけるため、オレオレ証明書となる。

サーバの管理者が発行した証明書署名要求(CSR)に対して、認証局(CA)がCAの秘密鍵で署名を行ったものが証明書(CRT)です。

# @ 認証局

# CRT(SSLサーバー証明書):証明書
# →自分で作ったので、自己署名証明書(オレオレ証明書)
openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt

ブラウザ(curl)でアクセスすると、Webサーバー側が、自己署名証明書(オレオレ証明書)を使用しているため以下出力される。危険性を理解して、閲覧することも可能。

curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

警告無視も可能

curl -k https://localhost:8081

本格的にオレオレ認証局を作成し、オレオレ認証局がサーバの証明書に署名する手順を紹介します。オレオレ認証局ルート証明書をクライアントにインストールすることでブラウザが警告なしでアクセスすることができるようになります。

一旦ここまで。

オレオレ認証局作成と、オレオレ認証局ルート証明書をクライアントにインストールするのは、参考にしたサイトで、実施しているので、とほほのOpenSSL入門 - とほほのWWW入門を参照する。

ちなみに続きは

@認証局
@Webサーバー
  • サーバーの秘密鍵を作成、サーバーのCSR証明書署名要求の作成
@認証局
  • openssl caコマンドを使って、[サーバーのCSR証明書署名要求]を取り込んで、署名する。WebサーバーのCRT署名証明書を作ってあげる。
@Webサーバ
@ブラウザ
  • オレオレ認証局の証明書.pem の拡張子を.cerに変更し、ブラウザに取り込む:これで警告なしでアクセス可能となる。
    • 持っている証明書と、Webサーバーからダウンロードしてきた証明書が同じか?→同じであれば、本人と判断。お墨付きをもらっているか確認。秘密鍵から作成しているので、本人以外あり得ない。

警告が出るのはどういうことか?

ブラウザ視点

ブラウザが持っている認証局の公開鍵を使って電子署名を復号し、デジタル証明書のハッシュ値を計算したものと比較する。別の人の秘密鍵を使って作成したので、合致しない。お墨付きが無い、知らない人のものであるとわかり、安全性を担保できないため、警告画面が出る。通信は暗号化されている。通信する相手が、攻撃者かもしれない。

オレオレ証明書について

相手の断定は難しい(実在証明が難しい)、受け入れてしまうことで、教育面でも、いろいろ問題が起こる。

結論として、第三者のお墨付きが必要。ブラウザと別経路で、証明書を取り入れ、検証することが必要。

ref.

Env.

~/  docker  exec -it  nginx /bin/bash  -c 'nginx -v'
nginx version: nginx/1.25.5
~/  

Rubyを使ったアナログ化

下リンクの逆変換を行う内容である。Rubyのデータ構造をテキスト化する。

yumayxx.hateblo.jp

Rubyのデータ構造

data = [
  {:id => "a", :val1 => [1, 2, 3], :val2 => [3, 4]},
  {:id => "b", :val1 => [0], :val2 => [9, 8, 7]}
]

変換後のテキスト

id val1 val2
a 1 3
2 4
3
b 0 9
8
7

変換スクリプト

data = [
  {:id => "a", :val1 => [1, 2, 3], :val2 => [3, 4]},
  {:id => "b", :val1 => [0], :val2 => [9, 8, 7]}
]

# ヘッダーを出力
puts data.first.keys.join("\t")

# データを処理して表形式に出力
data.each do |entry|
  id = entry[:id]
  val1 = entry[:val1]
  val2 = entry[:val2]
  
  # val1 と val2 の要素数の最大値を取得して、ループをその回数だけ繰り返す
  max_length = [val1.length, val2.length].max
  max_length.times do |i|
    # idの値は最初の行のみ表示し、それ以外の行は空白にする
    id_output = (i == 0 ? id : "")
    
    # val1 と val2 の要素があれば出力し、なければ空白を表示
    val1_output = (val1[i].nil? ? "" : val1[i])
    val2_output = (val2[i].nil? ? "" : val2[i])
    
    puts [id_output, val1_output, val2_output].join("\t")
  end
end
  • 値が存在しない場合は、""を代入するところがポイント

出力結果

id   val1    val2
a   1   3
    2   4
    3   
b   0   9
        8
        7

ひどいな。ひどい世の中だ。

作業スペースの構築 - AlmaLinux/Rocky Linux

ChatGPTに説明してもらう。


この文章は、私、ChatGPTが生成しました。私はOpenAIによって開発された人工知能言語モデルです。与えられたテキスト入力に基づいて、知識とパターンを活用して文章を生成します。

Rocky Linuxのインストールと作業スペースのセットアップ手順について簡単に述べます。

インストールメディアとインストール

メディア

これらのリンクは、AlmaLinuxとRocky Linuxという2つのLinuxディストリビューションのダウンロードページにつながっています。これらは、CentOSの代替として開発されたフリーでオープンソースオペレーティングシステムです。CentOSの将来のサポートに関する変更が発表された後、これらのプロジェクトはCentOSの代替として人気を集めています。

Rocky Linuxのインストール

Rocky Linuxで最小限のインストールを行い、開発者ツールを選択してインストールする手順を説明します。

  1. Rocky Linuxのインストール:

    • Rocky LinuxのISOイメージをダウンロードし、ブータブルなメディア(USBドライブまたはDVD)に書き込みます。
    • コンピューターを再起動し、ブータブルメディアから起動します。
    • インストールメニューが表示されたら、「Install Rocky Linux」を選択します。
    • インストールウィザードが開始されるので、言語やキーボードレイアウトなどの設定を行います。
  2. インストールタイプの選択:

    • 「インストール先」のセクションで、"Software Selection"を選択します。
    • ここで、"Minimal Install"を選択します。これにより、最小限のパッケージセットがインストールされます。
  3. 開発者ツールの選択:

    • インストールオプションの中に、"Development Tools"という項目があります。これを選択します。
    • "Development Tools"には、一般的な開発に必要なパッケージやツールが含まれています。これには、コンパイラやライブラリ、デバッグツールなどが含まれます。
  4. インストールの完了:

    • 他の設定を行い、インストールを続行します。これには、ネットワークの設定やユーザーアカウントの作成などが含まれます。
    • インストールが完了すると、Rocky Linuxが再起動されます。
  5. インストールの確認:

この手順に従うことで、Rocky Linuxを最小限のインストールから始め、開発者ツールを追加して開発環境をセットアップすることができます。

ネットワーク設定

これは、Linux上でNetworkManagerを使用してネットワーク設定を変更するためのコマンドです。まず、ネットワーク機能を有効にし、利用可能なデバイスをリストします。次に、特定のEthernet接続を削除し、新しいEthernet接続を作成します。その後、新しい接続のIPv4アドレス、ゲートウェイ、およびDNSサーバーを設定し、IPv4の設定方法を手動に変更し、IPv6を無効にします。最後に、設定を自動的に接続するように設定し、新しい接続をアップします。

nmcli networking on
nmcli device
c=enp0s
nmcli c delete $c
nmcli c add con-name $c ifname $c type ethernet
nmcli c mod $c ipv4.addresses 192.168.0.1/24
nmcli c mod $c ipv4.gateway 192.168.0.254
nmcli c mod $c ipv4.dns 192.168.0.254
nmcli c mod $c ipv4.method manual
nmcli c mod $c ipv6.method disabled
nmcli c mod $c connection.autoconnect yes
nmcli c up $c

sudo設定

user_name="user"
echo "${user_name} ALL=(ALL) ALL" > /etc/sudoers.d/${user_name}

このコマンドは、指定したユーザー(user)に対して、sudo権限を与えるためのsudoersファイルを作成します。具体的には、/etc/sudoers.d/ ディレクトリにユーザー名のファイルを作成し、そのファイルに user ALL=(ALL) ALL という行を書き込みます。これにより、ユーザー名でログインしたユーザーがsudoを使って任意のコマンドを実行できるようになります。ただし、このコマンドを実行する前に注意が必要です。sudoersファイルを直接編集する場合は、慎重に行い、構文エラーがないか確認してください。また、root権限での操作が必要となるため、管理者権限を持つことが前提となります。

パッケージのインストールのレポジトリ設定

これは、Rocky LinuxシステムでDVDからのパッケージのインストールを可能にするためのスクリプトです。

  1. 最初に、/root/reposディレクトリを作成し、/etc/yum.repos.d/ディレクトリ内のすべてのファイルを新しく作成した/root/reposディレクトリに移動します。

  2. 次に、/etc/yum.repos.d/dvd.repoというファイルを作成し、DVDからのリポジトリを定義します。DVD-REPODVD-REPO2という2つのセクションがあります。それぞれが、DVDのBaseOSとAppStreamセクションへのアクセスを提供します。これらのセクションには、それぞれのベースURL、有効化設定、GPGチェックの設定、およびGPGキーの場所が含まれています。

  3. 次に、dvd_mount.shという名前のスクリプトを作成します。このスクリプトは、DVDを/mediaディレクトリにマウントします。

  4. 最後に、作成したdvd_mount.shスクリプトを実行してDVDをマウントします。

mkdir /root/repos
mv /etc/yum.repos.d/* /root/repos

cat <<DVDREPO >/etc/yum.repos.d/dvd.repo
[DVD-REPO]
name=DVD-BaseOS
baseurl=file:///media/BaseOS/
enabled=1
gpgcheck=1
gpgkey=file:///media/RPM-GPG-KEY-Rocky-9

[DVD-REPO2]
name=DVD-AppStream
baseurl=file:///media/AppStream/
enabled=1
gpgcheck=1
gpgkey=file:///media/RPM-GPG-KEY-Rocky-9
DVDREPO

cat <<DVDMOUNT >dvd_mount.sh
mount /dev/cdrom /media
DVDMOUNT
sh dvd_mount.sh

dnfを使用したパッケージの更新とインストール

dnf -y install make vim git

このコマンドは、Rocky Linuxでパッケージを更新し、そしてmake、vim、gitの3つのパッケージをインストールするためのコマンドです。

  1. dnf -y update:

    • dnfは、Rocky LinuxFedoraなどのRed HatLinuxディストリビューションで使用されるパッケージ管理ユーティリティです。
    • -yオプションは、パッケージの更新を自動的に確認し、確認プロンプトを表示せずに更新を実行することを指示します。
    • updateコマンドは、システム内のすべてのパッケージを最新のバージョンに更新します。
  2. dnf -y install make vim git:

これらのコマンドを実行すると、Rocky Linuxシステムが最新の状態に更新され、そしてmake、vim、gitの3つの開発に役立つツールがインストールされます。

Rubyインストール

def -y install ruby rake rubygem-minitest

このコマンドは、システムにRubyと関連パッケージをインストールするためのものです。-yオプションは、パッケージのインストール中に確認を求めるプロンプトを無効にします。具体的には、Ruby本体とそのビルドツールであるrake、さらにRubyのテストフレームワークであるminitestをインストールします。

ツール類のインストール

cd
repos=("dotfiles" "ys1" "torp")
for repo in ${repos[@]}
do
git clone https://github.com/YumaYX/${repo}.git
done

cd ~/dotfiles
make install

このスクリプトは、以下の手順で動作します:

  1. 最初に、ユーザーのホームディレクトリに移動します。これにより、後続のコマンドが適切な場所で実行されます。

  2. 次に、reposという配列変数を定義します。この変数には、クローンするGitHubリポジトリの名前が含まれています。この場合、"dotfiles"、"ys1"、"torp"の3つのリポジトリが指定されています。

  3. forループを使って、repos配列内の各リポジトリ名に対して以下の手順を実行します:

  4. make installコマンドを使って、dotfilesリポジトリ内のMakefileで定義されたインストール手順を実行します。これにより、ユーザーのシステムにdotfilesリポジトリ内の設定やツールがインストールされます。

このスクリプトを実行することで、指定された3つのGitHubリポジトリからプロジェクトを取得し、そのうちの1つでインストールを実行することができます。

閉鎖空間でどこまでできるか - Ruby

RHEL派生ディストリビューションに含まれるRubyに関するパッケージを確認する。

目的

インターネット接続できない環境にて、Rubyをできる限り快適に使う。

前提

RHEL派生ディストリビューションが転がっている。無ければ以下からダウンロードする。

RHEL派生ディストリビューションに含まれるRubyに関するパッケージ

AlmaLinuxのAppStreamレポジトリに、Rubyに関するパッケージは下のパッケージが含まれる。

[root@a48fd3999d6e /]# dnf list | grep 'ruby'
libselinux-ruby.x86_64                               3.5-1.el9                           appstream
ruby.i686                                            3.0.4-160.el9_0                     appstream
ruby.x86_64                                          3.0.4-160.el9_0                     appstream
ruby-default-gems.noarch                             3.0.4-160.el9_0                     appstream
ruby-devel.i686                                      3.0.4-160.el9_0                     appstream
ruby-devel.x86_64                                    3.0.4-160.el9_0                     appstream
ruby-libs.i686                                       3.0.4-160.el9_0                     appstream
ruby-libs.x86_64                                     3.0.4-160.el9_0                     appstream
rubygem-bigdecimal.x86_64                            3.0.0-160.el9_0                     appstream
rubygem-bundler.noarch                               2.2.33-160.el9_0                    appstream
rubygem-io-console.x86_64                            0.5.7-160.el9_0                     appstream
rubygem-irb.noarch                                   1.3.5-160.el9_0                     appstream
rubygem-json.x86_64                                  2.5.1-160.el9_0                     appstream
rubygem-minitest.noarch                              5.14.2-160.el9_0                    appstream
rubygem-mysql2.x86_64                                0.5.3-11.el9_0                      appstream
rubygem-pg.x86_64                                    1.2.3-7.el9                         appstream
rubygem-power_assert.noarch                          1.2.0-160.el9_0                     appstream
rubygem-psych.x86_64                                 3.3.2-160.el9_0                     appstream
rubygem-rake.noarch                                  13.0.3-160.el9_0                    appstream
rubygem-rbs.noarch                                   1.4.0-160.el9_0                     appstream
rubygem-rdoc.noarch                                  6.3.3-160.el9_0                     appstream
rubygem-rexml.noarch                                 3.2.5-160.el9_0                     appstream
rubygem-rss.noarch                                   0.2.9-160.el9_0                     appstream
rubygem-test-unit.noarch                             3.3.7-160.el9_0                     appstream
rubygem-typeprof.noarch                              0.15.2-160.el9_0                    appstream
rubygems.noarch                                      3.2.33-160.el9_0                    appstream
rubygems-devel.noarch                                3.2.33-160.el9_0                    appstream
[root@a48fd3999d6e /]# 
[root@a48fd3999d6e /]# cat /etc/redhat-release 
AlmaLinux release 9.3 (Shamrock Pampas Cat)
[root@a48fd3999d6e /]# 
[root@a48fd3999d6e /]# date
Mon Apr 15 16:59:53 UTC 2024
[root@a48fd3999d6e /]# 

rakeや、テストフレームワークがあれば、様々なことが可能になる。bundlerも制限はあるが、gemコマンドを使って、活用できる。

その他RubyGemsに関して

レポジトリに含まれないRubyGemは、依存関係を解決して、Gemファイルをダウンロードして、ローカルインストールする必要がある。

actで、シンプルな環境から、依存性を確認できる。

ただし、環境構築・環境再現が、コスト的に難しいため、あまりいい思いはしない。

AlmaLinux 9/Rocky Linux 9によるPXEブート環境構築

PXEブート環境を構築して、LinuxディストリビューションのOSインストール自動化を可能にする。

何ができるか?

設定環境

  • 192.168.255.2/24
    • 新規サーバーはDHCPの始まり200が割り当てられる
  • ネットワーク内にDHCPサーバーが存在しないこと
  • インターネットに接続できること
  • インストールされるディストリビューションはダウンロードするISOファイルによって変更可能
  • Virtual boxの使用

※注意:ファイルの上書きを含む作業のため、壊しても問題ない環境で実施すること。責任を追うことは絶対にない。

VirtualBoxネットワーク設定

  • "mynetwork"を作成する

コマンド打鍵

BIOS

github.com

UEFI

github.com

  • Hyper-Vの第二世代はUEFIのみ
  • --allow-ssh RHEL9以降で使用可能オプション。RHEL 8はオプションなし、デフォルトでroot sshが可能。

設定内容

都度、必要なサービスポートを開放する。

PXE Boot環境の仮想マシンについて

Vagrantを使用して、作成しても構わない。プロビジョニング時にPXEをインストールするコマンド、シェルを含めることで、自動で環境構築できるようになる。

新規仮想マシンのプロビジョニング

仮想マシンの作成と起動シェル:Intel Mac

github.com

仮想マシンの作成と起動シェル作成:Windows

  • 省略

経緯

Vagrantでことが足りるのでは?と一瞬思うが、Vagrantで作成される仮想マシンのディスクの切り方が、メディアからの手動インストールと異なっていた。ディスクに関する検証実施時に、何度もOSインストールが必要となったため構築した。

いくつかの理由から仮想マシンのコピーは、実施しない。

参考サイト

以下サイトを参考にしている。

CentOS 8 : PXE Boot : ネットワークインストール : Server World

MacのメニューバーにRubyのバージョンを。

MacのメニューバーにRubyのバージョンを表示できるようにした。

youtu.be

Appleのヒューマンインターフェイスガイドラインにメニューバーのアイコンには色をつけない等読んだ記憶がある。赤い画像のため、表示中は、注意が持っていかれることがよくある。

仕組み

仕組みは、~/.rbenv/versionを監視をしているだけである。逆に言えば、rbenvの環境が必要となる。

GitHubレポジトリ

github.com

Apple Developer Programに加入する気はないので、各自で、アーカイブしてお使いください。

Rubyを使ったデジタル化

以下のようなCSVファイル、またはTextファイルの情報をRubyのオブジェクトに変換する。

parent child
id1 value0
value1
value2
id2 value3
value4
value5
value6
value7
id3 value8
value9

次のRubyスクリプトで、Rubyオブジェクト(Array)に変換する。

require "csv"
data = CSV.read("file.csv", encoding: "BOM|UTF-8", headers: true).map(&:to_h)

parentごとに、childをまとめる:Hashを使用した場合

all_hash = {}
tmp_id = ""

data.each do |hash|
  parent = hash["parent"]
  child = hash["child"]

  if parent.nil?
    all_hash[tmp_id] << hash["child"]
  else
    tmp_id = parent
    all_hash[tmp_id] = [child]
  end
end

Hashのキーにparent、バリューに複数のchildが入っていることがわかる。

all_hash
=> 
{"id1"=>["value0", "value1", "value2"],
 "id2"=>["value3", "value4", "value5", "value6", "value7"],
 "id3"=>["value8", "value9"]}

parentごとに、childをまとめる:Classを使用した場合

class Family
  attr_accessor :children

  def initialize(parent)
    @parent = parent
    @children = []
  end
end

arr = []
data.each do |hash|
  parent = hash["parent"]
  if parent.nil?
    arr.last.children << hash["child"]
  else
    arr << Family.new(parent)
  end
end

Familyオブジェクトが親子要素ごとに格納されていることがわかる。

arr
=> 
[#<Family:0x0000000102a26f68
  @children=["value1", "value2"],
  @parent="id1">,
 #<Family:0x0000000102a26ea0
  @children=["value4", "value5", "value6", "value7"],
  @parent="id2">,
 #<Family:0x0000000102a26e00
  @children=["value9"],
  @parent="id3">]