はじめまして、ネットワーク事業部の渡邉です。
最近は働き方改革や新しい生活様式の一環として、テレワークを実施している企業が増えています。
そのようにテレワークを行う際は、リモートVPNを利用して社内ネットワークに接続するという手法があります。
しかし、その際にはセキュリティに十分気を配りたいところです。
そこで今回は、YAMAHAのルータのLuaスクリプト機能を利用したL2TP/IPsecのワンタイムパスワードの設定についてご紹介します。
ルータの設定
今回はYAMAHAのRTX830を使用します。
前提として、ルータにはPPPoE接続とL2TP/IPsecの設定が既にされているものとします。
L2TP/IPsecの設定についてはこちらの記事を参考にしてください。
下記は今回使用するルータの設定例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
login password * administrator password * ip route default gateway pp 1 ip lan1 address 192.168.1.1/24 ip lan1 proxyarp on pp select 1 pp keepalive interval 30 retry-interval=30 count=12 pp always-on on pppoe use lan2 pppoe auto disconnect off pp auth accept pap chap pp auth myname 接続ID パスワード ppp lcp mru on 1454 ppp ipcp ipaddress on ppp ipcp msext on ppp ccp type none ip pp secure filter in 200003 200020 200021 200022 200023 200024 200025 200030 200032 200100 200101 200102 200103 ip pp secure filter out 200013 200020 200021 200022 200023 200024 200025 200026 200027 200099 dynamic 200080 200081 200082 200083 200084 200085 200098 200099 ip pp nat descriptor 1000 pp enable 1 pp select anonymous pp bind tunnel1-tunnel2 pp auth request mschap-v2 pp auth username PPPユーザ名1 パスワード1 pp auth username PPPユーザ名2 パスワード2 ppp ipcp ipaddress on ppp ipcp msext on ppp ccp type none ip pp remote address pool 192.168.1.151-192.168.1.180 ip pp mtu 1258 pp enable anonymous tunnel select 1 tunnel encapsulation l2tp ipsec tunnel 1 ipsec sa policy 1 1 esp aes-cbc sha-hmac ipsec ike keepalive use 1 off ipsec ike nat-traversal 1 on ipsec ike pre-shared-key 1 text 事前共有鍵 ipsec ike remote address 1 any l2tp tunnel disconnect time off ip tunnel tcp mss limit auto tunnel enable 1 tunnel select 2 tunnel encapsulation l2tp ipsec tunnel 2 ipsec sa policy 2 2 esp aes-cbc sha-hmac ipsec ike keepalive use 2 off ipsec ike nat-traversal 2 on ipsec ike pre-shared-key 2 text 事前共有鍵 ipsec ike remote address 2 any l2tp tunnel disconnect time off ip tunnel tcp mss limit auto tunnel enable 2 ip filter 200000 reject 10.0.0.0/8 * * * * ip filter 200001 reject 172.16.0.0/12 * * * * ip filter 200002 reject 192.168.0.0/16 * * * * ip filter 200003 reject 192.168.1.0/24 * * * * ip filter 200010 reject * 10.0.0.0/8 * * * ip filter 200011 reject * 172.16.0.0/12 * * * ip filter 200012 reject * 192.168.0.0/16 * * * ip filter 200013 reject * 192.168.1.0/24 * * * ip filter 200020 reject * * udp,tcp 135 * ip filter 200021 reject * * udp,tcp * 135 ip filter 200022 reject * * udp,tcp netbios_ns-netbios_ssn * ip filter 200023 reject * * udp,tcp * netbios_ns-netbios_ssn ip filter 200024 reject * * udp,tcp 445 * ip filter 200025 reject * * udp,tcp * 445 ip filter 200026 restrict * * tcpfin * www,21,nntp ip filter 200027 restrict * * tcprst * www,21,nntp ip filter 200030 pass * 192.168.1.0/24 icmp * * ip filter 200031 pass * 192.168.1.0/24 established * * ip filter 200032 pass * 192.168.1.0/24 tcp * ident ip filter 200033 pass * 192.168.1.0/24 tcp ftpdata * ip filter 200034 pass * 192.168.1.0/24 tcp,udp * domain ip filter 200035 pass * 192.168.1.0/24 udp domain * ip filter 200036 pass * 192.168.1.0/24 udp * ntp ip filter 200037 pass * 192.168.1.0/24 udp ntp * ip filter 200099 pass * * * * * ip filter 200100 pass * 192.168.1.1 udp * 500 ip filter 200101 pass * 192.168.1.1 esp * * ip filter 200102 pass * 192.168.1.1 udp * 4500 ip filter 200103 pass * 192.168.1.1 udp * 1701 ip filter 500000 restrict * * * * * ip filter dynamic 200080 * * ftp ip filter dynamic 200081 * * domain ip filter dynamic 200082 * * www ip filter dynamic 200083 * * smtp ip filter dynamic 200084 * * pop3 ip filter dynamic 200085 * * submission ip filter dynamic 200098 * * tcp ip filter dynamic 200099 * * udp nat descriptor type 1000 masquerade nat descriptor masquerade static 1000 1 192.168.1.1 udp 500 nat descriptor masquerade static 1000 2 192.168.1.1 esp nat descriptor masquerade static 1000 3 192.168.1.1 udp 4500 nat descriptor masquerade static 1000 4 192.168.1.1 udp 1701 ipsec auto refresh on ipsec transport 1 1 udp 1701 ipsec transport 2 2 udp 1701 telnetd host lan dhcp service server dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.1.2-192.168.1.100/24 dns host lan1 dns server pp 1 dns server select 500001 pp 1 any . restrict pp 1 dns private address spoof on schedule at 1 */* 00:00:00 * ntpdate ntp.nict.jp syslog l2tp service on statistics traffic on |
Luaスクリプト
LuaスクリプトはYAMAHAが公開しているものを使用します。
基本的にはそのまま使用できますが、設定値の部分は編集が必要です。
※YAMAHA設定例より
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
--[[ ●ワンタイムパスワード作成スクリプト 登録されたユーザーに対するワンタイムパスワードを作成し、メールで通知するスク リプトです。ユーザーは複数登録することができます。 <説明> ・このファイルを RTFS か外部メモリに保存してください。 ・本項目の config の設定では schedule at コマンドで定期的に Lua スクリプトが実 行されるように設定しています。 ・ワンタイムパスワードには半角英数字と"?"、"#"、"\"、"'"、"""、"^"、"<"、">"、を 除いた記号が使用され、文字数は4文字から64文字まで設定することができます。 ・ワンタイムパスワードは大文字、小文字が区別されますので注意してください。 ・★マークの付いた設定値は変更可能です。 <ノート> ・メールの送信失敗時、または設定値に誤りがあったときに出力する SYSLOG レベルを指 定可能です。 SYSLOG のレベルを指定するには、log_level を設定してください。 debug レベル、notice レベルの SYSLOG を出力するためには、それぞれ以下の設定 が必要です。 debug レベル ・・・ syslog debug on notice レベル・・・ syslog notice on ・本スクリプトファイルを編集する場合、文字コードは必ず Shift-JIS を使用してく ださい。 ]] --------------------------## 設定値 ##-------------------------------- -- 登録するユーザーの一覧(カンマで区切って列挙する) user_tbl = { -- ★ { name = "(PPPユーザー名1)", mail_tbl = { smtp_address = "(SMTPサーバーアドレス1)", from = "(送信元メールアドレス1)", to = "(宛先メールアドレス1)" } }, { name = "(PPPユーザー名2)", mail_tbl = { smtp_address = "(SMTPサーバーアドレス2)", from = "(送信元メールアドレス2)", to = "(宛先メールアドレス2)" } } } -- ワンタイムパスワードの文字数 (4 - 64 文字) digits = (ワンタイムパスワードの文字数) -- ★ -- メールの送信に失敗した時に出力する SYSLOG のレベル (info, debug, notice) log_level = "(SYSLOG レベル)" -- ★ ----------------------## 設定値ここまで ##---------------------------- ------------------------------------------------------------ -- 乱数を文字に変換するテーブル -- ------------------------------------------------------------ wd_tbl = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "!", "$", "%", "&", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "@", "[", "]", "_", "`", "{", "|", "}", "~" } ------------------------------------------------------------ -- ワンタイムパスワードを作成する関数 -- ------------------------------------------------------------ function make_pass(name) local i local pass = "" math.randomseed(os.time()) for i = 1, digits do pass = pass .. wd_tbl[math.random(#wd_tbl)] end cmd = "pp auth username " .. name .. " " .. pass rt.command("pp select anonymous") rt.command(cmd) rt.command("save") return pass end ------------------------------------------------------------ -- メール送信を行う関数 -- ------------------------------------------------------------ function send_mail(name, pass, mail_tbl) local sjct, text sjct = name .. " さんの新しいパスワードの通知" text = name .. " さんの新しいパスワードは\r\n" .. pass .. "\r\nになります。" mail_tbl.preface_of_text = false mail_tbl.subject = sjct mail_tbl.text = text return rt.mail(mail_tbl) end ------------------------------------------------------------ -- パラメーター確認を行う関数 -- ------------------------------------------------------------ function check_param() local i, k, v local err = false if digits < 4 or 64 < digits then err = true end for i = 1, #user_tbl do if user_tbl[i].name == "" then err = true end for k, v in pairs(user_tbl[i].mail_tbl) do if v == "" then err = true end end end return err end ------------------------------------------------------------ -- メインルーチン -- ------------------------------------------------------------ local i, pass, err if check_param() then rt.syslog(log_level, "Parameter Error. (OneTimePass.lua)") os.exit(0) end for i = 1, #user_tbl do pass = make_pass(user_tbl[i].name) err = send_mail(user_tbl[i].name, pass, user_tbl[i].mail_tbl) if not err then rt.syslog(log_level, "failed to send mail to " .. user_tbl[i].mail_tbl.to .. ". (OneTimePass.lua)") end end |
Luaスクリプトの動作
今回のLuaスクリプトを実行すると、次のような実行結果になります。
- スクリプトに設定されたPPPユーザのパスワードが変更される
- 変更後のパスワードを通知するメールが、ユーザ毎に設定した送信先に送られる
また、Luaスクリプトの実行はルータのスケジュール機能を利用する形です。
例えば毎日12時にスクリプトを実行するスケジュールを設定した場合、毎日12時にパスワードが変更されるので、当日12時から翌日の12時までが有効期限のパスワードが発行されるということになります。
「ワンタイムパスワード」というと、「1度きりのパスワード」というイメージを持つかもしれませんが、今回のスクリプトで発行されるパスワードは、次にパスワードが発行されるまでの間はずっと使い続けることになります。
もしかすると、厳密には「ワンタイムパスワード」ではないかもしれませんが、YAMAHAがワンタイムパスワードと言っているので気にしないことにします。
一応、スクリプトの実行スケジュールを1分毎などにすることでワンタイムパスワードらしくなりますが、パスワードの通知がメールである都合上、大量のメールを受け取ることになるのでよく検討しましょう。
設定手順
スクリプトの編集
それでは具体的に設定を進めていきましょう。
まずは上記のLuaスクリプトを編集していきます。
例として下記の内容で設定していきます。
- PPPユーザ名1:taro
- PPPユーザ名2:jiro
- SMTPサーバ:mail.example.jp
- 送信元アドレス:vpn@example.jp
- 送信先アドレス1:taro@example.jp
- 送信先アドレス2:jiro@example.jp
ユーザ情報の部分は下記のようになります。
1 2 3 4 5 6 7 8 9 10 |
user_tbl = { { name = "taro", mail_tbl = { smtp_address = "mail.example.jp", from = "vpn@example.jp", to = "taro@example.jp" } } } |
ユーザを追加する場合は次のようにカンマ区切りで追加します。
ここは各々の環境に合わせて、必要な分だけ追加してください。
今回は2名分なので、下記のように設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
user_tbl = { { name = "taro", mail_tbl = { smtp_address = "mail.example.jp", from = "vpn@example.jp", to = "taro@example.jp" } }, { name = "jiro", mail_tbl = { smtp_address = "mail.example.jp", from = "vpn@example.jp", to = "jiro@example.jp" } } } |
ちなみに、YAMAHAが公開しているスクリプトそのままだと認証情報がないので、SMTP認証を使用する場合は下記のようにします。
1 2 3 4 5 6 7 8 9 10 11 12 |
{ name = "(PPPユーザー名)", mail_tbl = { smtp_address = "(SMTPサーバーアドレス)", smtp_port = "587", smtp_auth_protocol = "plain", from = "(送信元メールアドレス)", smtp_auth_name = "(アカウント名)", smtp_auth_password = "(パスワード)", to = "(宛先メールアドレス)" } } |
ワンタイムパスワードの文字数とログについては次のように設定します。
なお、log_levelをdebugなどにした場合、ログを出力させるためにはdebug logをonにする必要があるので、今回はinfoにしておきます。
1 2 |
digits = 16 log_level = "info" |
これでスクリプトの編集はOKです。
作成したスクリプトファイルはTFTPでルータに転送します。
スクリプトファイルをルータに転送
スクリプトファイルを作成したら、外部メモリに保存してルータに接続しておくか、ルータの内蔵メモリにファイルを保存する必要があります。
今回はルータの内蔵メモリを使用する形で設定していきます。
なお、スクリプトファイルはクライアントPCのCドライブ直下に「onetime.lua」として作成されているものとし、ルータ側に作成したディレクトリ「dir1」に保存するものとします。
ルータ側でTFTPを許可します。
1 |
tftp host any |
ファイル格納用にディレクトリを作成しておきます。
1 |
make directory /dir1 |
クライアントPCからファイルを転送します。
1 2 |
cd c:\ tftp 192.168.1.1 put onetime.lua /dir1/onetime.lua/管理パスワード |
転送ができたらTFTPの許可設定は削除しておきます。
1 |
no tftp host any |
ここまでできたら、あとはルータのスケジュール機能でスクリプトを定期的に実行させればOKです。
1 |
schedule at 2 */* 12:00:00 * lua /dir1/onetime.lua |
これで毎日12時にスクリプトが実行され、パスワードの変更と通知が行われます。
ちなみに、VPNの接続中にパスワード変更が実行されても、一旦セッションが切れるまでは接続が途切れることはありません。
ワンタイムパスワードを個別に発行
今回のワンタイムパスワードのスクリプトですが、基本的にはルータに設定されているユーザの数だけ「user_tbl」の部分を追記して使うことになるかと思います。
当然ですが、同じスクリプトに設定されているユーザは同じタイミングでパスワードが変更されます。
しかし、ユーザ毎に別々にスクリプトを用意して、違うスケジュールで実行させることで、ユーザ毎にパスワード変更のタイミングをずらすという使い方ができます。
また、スクリプトで設定されていないユーザのパスワードは変更されないため、これを利用して特定のユーザのパスワードだけ固定しておくということも可能です。
まとめ
今回はYAMAHAルータのLuaスクリプト機能を使用したL2TP/IPsecのワンタイムパスワードの設定についてご紹介しました。
パスワードは定期的に変更することが望ましいですが、ユーザ数が多かったりすると手動で変更するのは手間だと思います。しかし、今回のスクリプトを利用すれば、最初の設定の手間だけで済むので便利な機能と言えるのではないでしょうか。
ただし、パスワードの変更頻度があまり高いと不便になる部分もあるので、週一、月一などで変更されるように設定すると良いかなと思います。
ちなみに、Luaスクリプトについては以前の記事でもいくつか紹介されていますので、興味のある方はぜひご覧ください。