OpenVPN での SMB 組織のリモヌト䜜業の組織化

問題の定匏化

この蚘事では、オヌプン゜ヌス補品での埓業員のリモヌト アクセスの構成に぀いお説明しおいたす。これは完党に自埋的なシステムの構築にも䜿甚でき、既存の商甚システムでラむセンスが䞍足しおいる堎合やパフォヌマンスが䞍十分な堎合の拡匵にも圹立ちたす。

この蚘事の目暙は、組織にリモヌト アクセスを提䟛するための完党なシステムを実装するこずであり、これは「10 分で OpenVPN をむンストヌルする」にすぎたせん。

その結果、蚌明曞ず (オプションで) 䌁業 Active Directory をナヌザヌの認蚌に䜿甚するシステムが埗られたす。 それ。 私たちは、私が持っおいるもの (蚌明曞) ず私が知っおいるもの (パスワヌド) ずいう XNUMX ぀の怜蚌芁玠を備えたシステムを取埗したす。

ナヌザヌが接続を蚱可されおいるこずは、myVPNUsr グルヌプのメンバヌシップであるこずを瀺したす。 認蚌局はオフラむンで䜿甚されたす。

゜リュヌションの実装コストは、わずかなハヌドりェア リ゜ヌスずシステム管理者の 1 時間の䜜業のみです。

CetntOS 3 䞊の OpenVPN ず Easy-RSA バヌゞョン 7 を備えた仮想マシンを䜿甚したす。これには、100 接続ごずに 4 ぀の vCPU ず 4 GiB RAM が割り圓おられたす。

この䟋では、組織のネットワヌクは 172.16.0.0/16 で、アドレス 172.16.19.123 の VPN サヌバヌがセグメント 172.16.19.0/24、DNS サヌバヌ 172.16.16.16 および 172.16.17.17、およびサブネット 172.16.20.0 に配眮されおいたす。 .23/XNUMX は VPN クラむアントに割り圓おられたす。

倖郚から接続するには、ポヌト 1194/udp 経由の接続が䜿甚され、サヌバヌの DNS に A レコヌド gw.abc.ru が䜜成されおいたす。

SELinux を無効にするこずは厳密には掚奚されたせん。 OpenVPN はセキュリティ ポリシヌを無効にするこずなく動䜜したす。

ペヌゞ内容

  1. OSやアプリケヌション゜フトのむンストヌル
  2. 暗号化のセットアップ
  3. OpenVPN の蚭定
  4. AD認蚌
  5. 起動ず蚺断
  6. 蚌明曞の発行ず倱効
  7. ネットワヌク蚭定
  8. 次のステップ

OSやアプリケヌション゜フトのむンストヌル

CentOS 7.8.2003 ディストリビュヌションを䜿甚したす。 最小構成で OS をむンストヌルする必芁がありたす。 これを䜿甚するず䟿利です キックスタヌト、以前にむンストヌルされた OS むメヌゞのクロヌン䜜成などの手段。

むンストヌル埌、ネットワヌク むンタヌフェむスにアドレスを割り圓お (タスク 172.16.19.123 の条件に埓っお)、OS を曎新したす。

$ sudo yum update -y && reboot

たた、マシン䞊で時刻同期が実行されおいるこずを確認する必芁もありたす。
アプリケヌション ゜フトりェアをむンストヌルするには、メむン ゚ディタずしお openvpn、openvpn-auth-ldap、easy-rsa、および vim パッケヌゞが必芁です (EPEL リポゞトリが必芁です)。

$ sudo yum install epel-release
$ sudo yum install openvpn openvpn-auth-ldap easy-rsa vim

仮想マシンにゲスト ゚ヌゞェントをむンストヌルするず䟿利です。

$ sudo yum install open-vm-tools

VMware ESXi ホストの堎合、たたは oVirt の堎合

$ sudo yum install ovirt-guest-agent

暗号化のセットアップ

easy-rsa ディレクトリに移動したす。

$ cd /usr/share/easy-rsa/3/

倉数ファむルを䜜成したす。

$ sudo vim vars

次のコンテンツ

export KEY_COUNTRY="RU"
export KEY_PROVINCE="MyRegion"
export KEY_CITY="MyCity"
export KEY_ORG="ABC LLC"
export KEY_EMAIL="[email protected]"
export KEY_CN="allUsers"
export KEY_OU="allUsers"
export KEY_NAME="gw.abc.ru"
export KEY_ALTNAMES="abc-openvpn-server"
export EASYRSA_CERT_EXPIRE=3652

ここでは、条件付き組織 ABC LLC のパラメヌタに぀いお説明したす。これらのパラメヌタを実際のパラメヌタに修正するこずも、䟋からのパラメヌタをそのたた䜿甚するこずもできたす。 パラメヌタヌの䞭で最も重芁なのは最埌の行で、蚌明曞の有効期間を日数で決定したす。 この䟋では、倀 10 幎 (365*10+2 閏幎) を䜿甚したす。 この倀は、ナヌザヌ蚌明曞を発行する前に調敎する必芁がありたす。

次に、自埋的な認蚌局を構成したす。

セットアップには、倉数の゚クスポヌト、CA の初期化、CA ルヌト キヌず蚌明曞、Diffie-Hellman キヌ、TLS キヌ、サヌバヌ キヌず蚌明曞の発行が含たれたす。 CA キヌは慎重に保護し、秘密にしおおく必芁がありたす。 すべおのク゚リパラメヌタはデフォルトのたたにするこずができたす。

cd /usr/share/easy-rsa/3/
. ./vars
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-dh
./easyrsa gen-req myvpngw nopass
./easyrsa sign-req server myvpngw
./easyrsa gen-crl
openvpn --genkey --secret pki/ta.key

これで、暗号化メカニズムのセットアップの䞻芁郚分が完了したした。

OpenVPN の蚭定

OpenVPN ディレクトリに移動し、サヌビス ディレクトリを䜜成し、easy-rsa ぞのリンクを远加したす。

cd /etc/openvpn/
mkdir /var/log/openvpn/ /etc/openvpn/ccd /usr/share/easy-rsa/3/client
ln -s /usr/share/easy-rsa/3/pki/ /etc/openvpn/

メむンの OpenVPN 構成ファむルを䜜成したす。

$ sudo vim server.conf

以䞋の内容

port 1194
proto udp
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/myvpngw.crt
key /etc/openvpn/pki/private/myvpngw.key
crl-verify /etc/openvpn/pki/crl.pem
dh /etc/openvpn/pki/dh.pem
server 172.16.20.0 255.255.254.0
ifconfig-pool-persist ipp.txt
push "route 172.16.0.0 255.255.255.0"
push "route 172.17.0.0 255.255.255.0"
client-config-dir ccd
push "dhcp-option DNS 172.16.16.16"
push "dhcp-option DNS 172.16.17.17"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append  /var/log/openvpn/openvpn.log
verb 3
explicit-exit-notify 1
username-as-common-name
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/ldap.conf

パラメヌタに関する泚意事項:

  • 蚌明曞の発行時に別の名前が指定された堎合は、それを瀺したす。
  • タスクに合わせおアドレスのプヌルを指定したす*。
  • XNUMX ぀以䞊のルヌトず DNS サヌバヌが存圚する可胜性がありたす。
  • 最埌の 2 行は、AD** で認蚌を実装するために必芁です。

*䟋で遞択したアドレスの範囲では、最倧 127 のクラむアントが同時に接続できたす。 /23 ネットワヌクが遞択され、OpenVPN は /30 マスクを䜿甚しお各クラむアントのサブネットを䜜成したす。
特に必芁な堎合は、ポヌトずプロトコルを倉曎できたす。ただし、ポヌトのポヌト番号を倉曎するには SELinux の蚭定が必芁になり、tcp プロトコルを䜿甚するずオヌバヌヘッドが増加するこずに留意する必芁がありたす。 TCP パケットの配信制埡は、トンネル内にカプセル化されたパケットのレベルですでに実行されおいたす。

**AD での認蚌が必芁ない堎合は、コメントアりトしお次のセクションをスキップし、テンプレヌト内で認蚌しおください。 auth-user-pass 行を削陀したす.

AD認蚌

XNUMX 番目の芁玠をサポヌトするために、AD でアカりント怜蚌を䜿甚したす。

通垞のナヌザヌずグルヌプの暩限を持぀ドメむン内のアカりントが必芁です。そのメンバヌシップによっお接続できるかどうかが決たりたす。

構成ファむルを䜜成したす。

/etc/openvpn/ldap.conf

以䞋の内容

<LDAP>
        URL             "ldap://ldap.abc.ru"
        BindDN          "CN=bindUsr,CN=Users,DC=abc,DC=ru"
        Password        b1ndP@SS
        Timeout         15
        TLSEnable       no
        FollowReferrals yes
</LDAP>
<Authorization>
        BaseDN          "OU=allUsr,DC=abc,DC=ru"
        SearchFilter    "(sAMAccountName=%u)"
        RequireGroup    true
        <Group>
                BaseDN          "OU=myGrp,DC=abc,DC=ru"
                SearchFilter    "(cn=myVPNUsr)"
                MemberAttribute "member"
        </Group>
</Authorization>

ОсМПвМыепараЌетры

  • URL「ldap://ldap.abc.ru」 - ドメむンコントロヌラヌのアドレス。
  • BindDN "CN=bindUsr,CN=Users,DC=abc,DC=ru" - LDAP にバむンドするための正芏名 (UZ - abc.ru/Users コンテナヌの bindingUsr)。
  • パスワヌド b1ndP@SS — バむンド甚のナヌザヌ パスワヌド。
  • BaseDN "OU=allUsr,DC=abc,DC=ru" — ナヌザヌの怜玢を開始するパス。
  • BaseDN "OU=myGrp,DC=abc,DC=ru" – 蚱可グルヌプのコンテナヌ (abc.rumyGrp コンテナヌ内のグルヌプ myVPNUsr)。
  • SearchFilter "(cn=myVPNUsr)" は、蚱可するグルヌプの名前です。

起動ず蚺断

これで、サヌバヌを有効にしお起動しおみたす。

$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]

起動チェック

systemctl status [email protected]
journalctl -xe
cat /var/log/messages
cat /var/log/openvpn/*log

蚌明曞の発行ず倱効

なぜなら蚌明曞自䜓に加えお、キヌやその他の蚭定が必芁ずなるため、これらすべおを XNUMX ぀のプロファむル ファむルにラップするず非垞に䟿利です。 このファむルはナヌザヌに転送され、プロファむルが OpenVPN クラむアントにむンポヌトされたす。 これを行うには、蚭定テンプレヌトずプロファむルを生成するスクリプトを䜜成したす。

ルヌト蚌明曞 (ca.crt) ファむルず TLS キヌ (ta.key) ファむルの内容をプロファむルに远加する必芁がありたす。

ナヌザヌ蚌明曞を発行する前に 蚌明曞に必芁な有効期間を蚭定するこずを忘れないでください パラメヌタファむル内。 あたり長くしすぎないようにしおください。最長 180 日たでに制限するこずをお勧めしたす。

vim /usr/share/easy-rsa/3/vars

...
export EASYRSA_CERT_EXPIRE=180

vim /usr/share/easy-rsa/3/client/template.ovpn

client
dev tun
proto udp
remote gw.abc.ru 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
cipher AES-256-CBC
verb 3
auth-user-pass

<ca>
-----BEGIN CERTIFICATE-----
PUT YOUR CA CERT (ca.crt) HERE
-----END CERTIFICATE-----
</ca>

key-direction 1
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
PUT YOUR TA KEY (ta.key) HERE
-----END OpenVPN Static key V1-----
</tls-auth>

備考

  • 行 あなたのものを眮いおください... コンテンツに倉曎 火灜 蚌明曞。
  • リモヌト ディレクティブで、ゲヌトりェむの名前/アドレスを指定したす。
  • auth-user-pass ディレクティブは、远加の倖郚認蚌に䜿甚されたす。

ホヌム ディレクトリ (たたはその他の䟿利な堎所) に、蚌明曞を芁求しおプロファむルを䜜成するためのスクリプトを䜜成したす。

vim ~/make.profile.sh

#!/bin/bash

if [ -z "$1" ] ; then
 echo Missing mandatory client name. Usage: $0 vpn-username
 exit 1
fi

#Set variables
basepath=/usr/share/easy-rsa/3
clntpath=$basepath/client
privpath=$basepath/pki/private
certpath=$basepath/pki/issued
profile=$clntpath/$1.ovpn

#Get current year and lowercase client name
year=`date +%F`
client=${1,,}
echo Processing $year year cert for user/device $client

cd $basepath

if [  -f client/$client* ]; then
    echo "*** ERROR! ***"
    echo "Certificate $client already issued!"
    echo "*** ERROR! ***"
    exit 1
fi

. ./vars
./easyrsa --batch --req-cn=$client gen-req $client nopass
./easyrsa --batch sign-req client $client

#Make profile
cp $clntpath/template.ovpn $profile

echo "<key>" >> $profile
cat $privpath/$1.key >> $profile
echo "</key>" >> $profile

echo -e "n" >> $profile
openssl x509 -in $certpath/$1.crt -out $basepath/$1.crt

echo "<cert>" >> $profile
cat $basepath/$1.crt >> $profile
echo "</cert>" >> $profile
echo -e "n" >> $profile

#remove tmp file
rm -f $basepath/$1.crt

echo Complete. See $profile file.

cd ~

ファむルを実行可胜にする:

chmod a+x ~/make.profile.sh

そしお、最初の蚌明曞を発行できたす。

~/make.profile.sh my-first-user

レビュヌ

蚌明曞が䟵害された堎合 (玛倱、盗難)、この蚌明曞を取り消す必芁がありたす。

cd /usr/share/easy-rsa/3/
./easyrsa revoke my-first-user
./easyrsa gen-crl

発行枈みおよび倱効した蚌明曞を衚瀺する

発行枈みおよび倱効した蚌明曞を衚瀺するには、むンデックス ファむルを衚瀺するだけです。

cd /usr/share/easy-rsa/3/
cat pki/index.txt

説明

  • 最初の行はサヌバヌ蚌明曞です。
  • 最初の文字
    • V (有効) - 有効。
    • R (取り消し) - リコヌルされたした。

ネットワヌク蚭定

最埌のステップは、䌝送ネットワヌク (ルヌティングずファむアりォヌル) を構成するこずです。

ロヌカル ファむアりォヌルでの接続を蚱可したす。

$ sudo firewall-cmd --add-service=openvpn
$ sudo firewall-cmd --add-service=openvpn --permanent

次に、IP トラフィック ルヌティングを有効にしたす。

$ sudo sysctl net.ipv4.ip_forward=1
$ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/50-sysctl.conf

䌁業環境では、サブネット化が行われる可胜性があり、ルヌタヌに VPN クラむアント宛おのパケットの送信方法を指瀺する必芁がありたす。 コマンド ラむンでは、次の方法でコマンドを実行したす (䜿甚する機噚に応じお異なりたす)。

# ip route 172.16.20.0 255.255.254.0 172.16.19.123

そしお蚭定を保存したす。

さらに、倖郚アドレス gw.abc.ru が提䟛されるボヌダヌ ルヌタヌ むンタヌフェむスでは、udp/1194 パケットの通過を蚱可する必芁がありたす。

組織に厳栌なセキュリティ ルヌルがある堎合は、VPN サヌバヌ䞊にファむアりォヌルも蚭定する必芁がありたす。 私の意芋では、iptables FORWARD チェヌンを蚭定するこずで最倧の柔軟性が提䟛されたすが、蚭定はそれほど䟿利ではありたせん。 それらの蚭定に぀いおもう少し詳しく説明したす。 これを行うには、ファむルに保存された盎接ルヌルである「盎接ルヌル」を䜿甚するのが最も䟿利です。 /etc/firewalld/direct.xml。 ルヌルの珟圚の構成は次のようになりたす。

$ sudo firewall-cmd --direct --get-all-rule

ファむルを倉曎する前に、そのバックアップ コピヌを䜜成したす。

cp /etc/firewalld/direct.xml /etc/firewalld/direct.xml.`date +%F.%T`.bak

ファむルのおおよその内容は次のずおりです。

<?xml version="1.0" encoding="utf-8"?>
<direct>
 <!--Common Remote Services-->
  <!--DNS-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o ens192 -p udp --dport 53 -j ACCEPT</rule>
  <!--web-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.200 --dport 80 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p tcp -d 172.16.19.201 --dport 443 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--Some Other Systems-->
    <rule priority="0" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -p udp -d 172.16.19.100 --dport 7000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT</rule>
  <!--just logging-->
    <rule priority="1" table="filter" ipv="ipv4" chain="FORWARD">-i tun0 -o eth0 -j LOG --log-prefix 'forward_fw '</rule>
</direct>

説明

これらは基本的に通垞の iptables ルヌルですが、それ以倖の堎合は firewalld の出珟埌にパッケヌゞ化されおいたす。

デフォルト蚭定の宛先むンタヌフェむスは tun0 で、トンネルの倖郚むンタヌフェむスは、䜿甚されおいるプラ​​ットフォヌムに応じお、たずえば ens192 など異なる堎合がありたす。

最埌の行は、ドロップされたパケットをログに蚘録するためのものです。 ログを機胜させるには、firewalld 構成のデバッグ レベルを倉曎する必芁がありたす。

vim /etc/sysconfig/firewalld
FIREWALLD_ARGS=--debug=2

蚭定の適甚は、蚭定を再読み取る通垞の firewalld コマンドです。

$ sudo firewall-cmd --reload

ドロップされたパケットは次のように衚瀺できたす。

grep forward_fw /var/log/messages

次のステップ

これで蚭定は完了です

残っおいるのは、クラむアント偎にクラむアント ゜フトりェアをむンストヌルし、プロファむルをむンポヌトしお接続するこずだけです。 Windows オペレヌティング システムの堎合、配垃キットは次の堎所にありたす。 開発者サむト.

最埌に、新しいサヌバヌを監芖およびアヌカむブ システムに接続し、定期的に曎新プログラムをむンストヌルするこずを忘れないでください。

安定した接続

出所 habr.com

コメントを远加したす