StrongswanでIKEv2のVPNサーバを構築する2
経緯
VPNサーバは構築した、、、
でもユーザーとパスワードですぐに突破されるからだめっぽいかもしれん
証明書がないとログインできないようにしよう
過去記事
どのようにやるのか?
なんか以下のサイトをみたところstrongswan
で認証局を作成してクライアント証明書を発行できるとのこと
証明書のくだりはいまだによくわかってないのでひとまず記事の通りにやってみる
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>
次は他の認証も試してみる