m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

StrongswanでIKEv2のVPNサーバを構築する2

経緯

VPNサーバは構築した、、、
でもユーザーとパスワードですぐに突破されるからだめっぽいかもしれん

証明書がないとログインできないようにしよう

過去記事

m-shige1979.hatenablog.com

どのようにやるのか?

なんか以下のサイトをみたところstrongswan認証局を作成してクライアント証明書を発行できるとのこと 証明書のくだりはいまだによくわかってないのでひとまず記事の通りにやってみる

seinolab.jp

CA(認証局)の作成

※ sudoコマンドでroot権限に移動して作業する

CA用ディレクトリを作成

mkdir -p /etc/pki/myCA/cacerts

CA用のプライベート鍵を生成し、権限を変更

strongswan pki \
  --gen \
  --type rsa \
  --size 4096 \
  --outform pem > /etc/pki/myCA/cacerts/root.key.pem
chmod 600 /etc/pki/myCA/cacerts/root.key.pem

CA用のルート証明書を作成

strongswan pki --self --ca \
    --lifetime 3660 \
    --in /etc/pki/myCA/cacerts/root.key.pem \
    --type rsa \
    --dn "C=JP, ST=自分の地域, O=自分のorganization, CN=自分のRoot CA" \
    --outform pem > /etc/pki/myCA/cacerts/root.cert.pem

※DN値は各自の値に合わせる

x509形式に変換

openssl x509 \
    -in /etc/pki/myCA/cacerts/root.cert.pem \
    -outform DER \
    -out /etc/pki/myCA/cacerts/root.cert.der

CRL(証明書の失効リスト)を作成

mkdir -p /etc/pki/myCA/crls
strongswan pki \
    --signcrl \
    --cacert /etc/pki/myCA/cacerts/root.cert.pem \
    --cakey /etc/pki/myCA/cacerts/root.key.pem \
    --lifetime=150 \
    --outform pem > /etc/pki/myCA/crls/crl.pem

CAをStrongswanへ配備する

# tree /etc/pki/myCA/cacerts/
/etc/pki/myCA/cacerts/
├── root.cert.der
├── root.cert.pem
└── root.key.pem

0 directories, 3 files
#
# sudo ln -s /etc/pki/myCA/cacerts/root.cert.pem /etc/strongswan/ipsec.d/cacerts/
#

クライアント証明書の発行

※クライアントの識別名はvpnuserとして進める

ディレクトリを作成

mkdir -p /etc/pki/myCA/clients

鍵ファイルを作成し、権限を設定

strongswan pki \
    --gen \
    --type rsa \
    --size 2048 \
    --outform pem > /etc/pki/myCA/clients/vpnuser.key.pem
chmod 600 /etc/pki/myCA/clients/vpnuser.key.pem

公開鍵の形式へ変換

strongswan pki \
    --pub \
    --in /etc/pki/myCA/clients/vpnuser.key.pem \
    --type rsa > /etc/pki/myCA/clients/vpnuser.key.pem.pub

クライアント証明書作成

strongswan pki \
    --issue \
    --lifetime 3660 \
    --in /etc/pki/myCA/clients/vpnuser.key.pem.pub \
    --cacert /etc/pki/myCA/cacerts/root.cert.pem \
    --cakey /etc/pki/myCA/cacerts/root.key.pem \
    --dn "C=JP, O=自分のorganization, CN=vpnuser" \
    --san vpnuser \
    --outform pem > /etc/pki/myCA/clients/vpnuser.cert.pem

p12ファイルで出力

openssl pkcs12 -export \
    -inkey /etc/pki/myCA/clients/vpnuser.key.pem \
    -in /etc/pki/myCA/clients/vpnuser.cert.pem \
    -certfile /etc/pki/myCA/cacerts/root.cert.pem \
    -caname "自分のRoot CA" \
    -name "自分のorganization client certificate" \
    -out /etc/pki/myCA/clients/vpnuser.p12

クライアント証明書をStrongswanへ配備

sudo ln -s /etc/pki/myCA/clients/vpnuser.cert.pem /etc/strongswan/ipsec.d/certs/

Strongswan設定

/etc/strongswan/ipsec.conf

末尾に追加

conn ikev2-vpn-rsa
    auto=add
    compress=no
    type=tunnel
    fragmentation=yes
    forceencaps=yes
    left=%any
    leftid=@vpn.test-ryuouen.link
    leftcert=cert.pem
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=vpnuser
    rightcert=vpnuser.cert.pem
    rightca="C=JP, ST=Fukuoka, O=mshige1979 organization, CN=mshige1979 Root CA"
    rightsourceip=192.168.100.0/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never
    eap_identity=%identity

自分の端末へp12ファイルをコピー

これは各自の方法で行う
以下は例

scp ec2-user@サーバアドレス:/etc/pki/myCA/clients/vpnuser.p12 ~/Downloads

証明書を信頼するように変更

できた

一旦、ユーザーパスワードのやつを消す

/etc/strongswan/ipsec.secret

~
~
"/etc/strongswan/ipsec.secrets" 6L, 135B                                                                              5,1          全て
# ipsec.secrets - strongSwan IPsec secrets file
: RSA "privkey.pem"

# ユーザーパスワード
#vpn_username : EAP "vpn_password"

おまけ

構成プロファイル

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>DNS</key>
            <dict>
                <key>ServerAddresses</key>
                <array>
                    <string>8.8.8.8</string>
                    <string>8.8.4.4</string>
                </array>
                <key>SupplementalMatchDomainsNoSearch</key>
                <integer>0</integer>
            </dict>
            <key>IKEv2</key>
            <dict>
                <key>AuthenticationMethod</key>
                <string>Certificate</string>
                <key>ChildSecurityAssociationParameters</key>
                <dict>
                    <key>DiffieHellmanGroup</key>
                    <integer>14</integer>
                    <key>EncryptionAlgorithm</key>
                    <string>AES-256</string>
                    <key>IntegrityAlgorithm</key>
                    <string>SHA2-256</string>
                    <key>LifeTimeInMinutes</key>
                    <integer>1440</integer>
                </dict>
                <key>DeadPeerDetectionRate</key>
                <string>Medium</string>
                <key>DisableMOBIKE</key>
                <integer>0</integer>
                <key>DisableRedirect</key>
                <integer>0</integer>
                <key>EnableCertificateRevocationCheck</key>
                <integer>0</integer>
                <key>EnableFallback</key>
                <integer>0</integer>
                <key>EnablePFS</key>
                <integer>0</integer>
                <key>IKESecurityAssociationParameters</key>
                <dict>
                    <key>DiffieHellmanGroup</key>
                    <integer>14</integer>
                    <key>EncryptionAlgorithm</key>
                    <string>AES-256</string>
                    <key>IntegrityAlgorithm</key>
                    <string>SHA2-256</string>
                    <key>LifeTimeInMinutes</key>
                    <integer>1440</integer>
                </dict>
                <key>LocalIdentifier</key>
                <string>vpnuser</string>
                <key>PayloadCertificateUUID</key>
                <string>システムが発行する可変値</string>
                <key>RemoteAddress</key>
                <string>vpn.test-ryuouen.link</string>
                <key>RemoteIdentifier</key>
                <string>vpn.test-ryuouen.link</string>
                <key>UseConfigurationAttributeInternalIPSubnet</key>
                <integer>0</integer>
            </dict>
            <key>PayloadDescription</key>
            <string>VPN設定を構成します</string>
            <key>PayloadDisplayName</key>
            <string>VPN</string>
            <key>PayloadIdentifier</key>
            <string>com.apple.vpn.managed.システムが発行する可変値</string>
            <key>PayloadType</key>
            <string>com.apple.vpn.managed</string>
            <key>PayloadUUID</key>
            <string>システムが発行する可変値</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>Proxies</key>
            <dict>
                <key>HTTPEnable</key>
                <integer>0</integer>
                <key>HTTPSEnable</key>
                <integer>0</integer>
            </dict>
            <key>UserDefinedName</key>
            <string>IKEv2証明書</string>
            <key>VPNType</key>
            <string>IKEv2</string>
        </dict>
        <dict>
            <key>Password</key>
            <string>証明書のパスワード</string>
            <key>PayloadCertificateFileName</key>
            <string>vpnuser.p12</string>
            <key>PayloadContent</key>
            <data>
            多分、p12が発行する証明書のデータ
            </data>
            <key>PayloadDescription</key>
            <string>PKCS#12フォーマットの証明書を追加します</string>
            <key>PayloadDisplayName</key>
            <string>vpnuser.p12</string>
            <key>PayloadIdentifier</key>
            <string>com.apple.security.pkcs12.システムが発行する可変値</string>
            <key>PayloadType</key>
            <string>com.apple.security.pkcs12</string>
            <key>PayloadUUID</key>
            <string>システムが発行する可変値</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
        </dict>
    </array>
    <key>PayloadDisplayName</key>
    <string>vpnテスト2</string>
    <key>PayloadIdentifier</key>
    <string>システムが発行する可変値</string>
    <key>PayloadRemovalDisallowed</key>
    <false/>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>システムが発行する可変値</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
</dict>
</plist>

次は他の認証も試してみる

参考

Strongswan で IKEv2 VPN サーバを構築する 後編 | seinolab