パスワードがほしいとき用。
<?php
echo exec(“head /dev/urandom | tr -dc a-km-np-z2-9 | head -c 13”);
head
先頭から10行
/dev/urandom
ランダムな文字列
tr -dc
指定した文字列の集合
head -c
指定した文字数
パスワードがほしいとき用。
<?php
echo exec(“head /dev/urandom | tr -dc a-km-np-z2-9 | head -c 13”);
head
先頭から10行
/dev/urandom
ランダムな文字列
tr -dc
指定した文字列の集合
head -c
指定した文字数
とりあえず確認方法として以下の通り。他のレンサバで実行してみた。
MTA確認
alternatives –display mta
sendmailの場合、
“/etc/alternatives/mta -> /usr/sbin/sendmail.sendmail”
Postfixの場合、
“/etc/alternatives/mta -> /usr/sbin/sendmail.postfix”
もし切り替えるなら
alternatives –config mta
Courier-IMAPのバージョン
/usr/lib/courier-imap/bin/imapd –version
今回はムームーでドメイン取得。
ドメイン操作>ムームーDNS
対象ドメインの変更をクリック。
サブドメイン / 種別 / 内容
* / TXT / v=spf1 +ip4:xxx.xxx.xxx.xxx ~all
* / A / xxx.xxx.xxx.xxx
空白 / TXT / v=spf1 +ip4:xxx.xxx.xxx.xxx ~all
空白 / A / xxx.xxx.xxx.xxx
空白 / MX / domain.com
このような感じで登録。
・インストール
sudo apt install postfix
Please select the mail server configuration type that best meets your needs
と表示される。
Internet Site(インターネットサイト)
を選択。
次の画面では、
The “mail name” is the domain name used to “qualify” _ALL_ mail address …
等々表示される。
ここではドメイン名を入力。
・設定
sudo vim /etc/postfix/main.cf
myhostname = ドメイン名
に変更する。
DNSで正引きできないと、宛先のメールサーバーから受信拒否されるので、DNSで正引きできる(=Aレコードが存在する)
ちなみに、完全修飾ドメイン名を指定する。
(サブドメインなどを省略しないことアドレス)
mydomain / 指定無し
指定しなければ、デフォルトで$myhostnameから算出される。
myorigin = /etc/mailname
投函されたメールがどのドメインから来るように見えるか。
inet_interfaces = all
リッスンするインターフェース。送信のみで受信しないならlocalhostでもOK。
inet_protocols = ipv4
IPv4のみ
mydestination = $myhostname
自分が宛先(最終)になる場合のドメイン名を指定する。 メールアドレスの右側が mydestinationに一致すると、そのメールは他のサーバには配送せず処理する。 そこで存在しないユーザ宛の場合、エラーになり、送信者にエラーメールを返す。
mynetworks = 127.0.0.0/8 192.168.12.0/24
メールの転送することができる(許可するクライアント)IPアドレスリストを指定する。もし0.0.0.0/0 として、ufwで25を許可すると、スパムメールの踏み台となる。
今回はVPNで固定IPなので、
mynetworks = 127.0.0.0/8 192.168.12.2
と言う感じでもOK。
home_mailbox = mail/
これで/home/ubuntu/mailにメールが入る。
ちなみに、デフォルト状態では環境にもよるが、
/var/mail/ユーザ名
にmbox形式で入る。
再起動
sudo systemctl restart postfix
起動設定
sudo systemctl enable postfix
・ポート開放
sudo ufw allow 25/tcp
sudo ufw reload
ここまでやると、ユーザー名@ドメインで受信できる。
必要ならユーザーを追加する。
・ここで試しに送信。
> sendmail -t
From: xxx
To: xxx
Subject: xxx
xxx
. (最後は.でEnter)
・サブミッションポート有効化する場合
sudo vim /etc/postfix/master.cf
コメントアウト削除(今回は不要)
submission inet n – n – – smtpd
今回はSASL認証を利用しない(クライアントとVPNでつながっているので、mynetworksでローカルアドレスのみ許可しているが、通常はSASL認証を設定する)が、通常は以下のように設定する。
-o smtpd_sasl_auth_enable=yes
SMTP Authを有効
-o smtpd_recipient_restrictions = permit_sasl_authenticated, reject
転送要求の可否(SMTP Auth で認証が確認された接続を許可)
-o smtpd_client_restrictions = permit_sasl_authenticated, reject
接続要求の可否(SMTP Auth で認証が確認された接続を許可)
・ポート開放(今回は不要)
sudo ufw allow 587/tcp
sudo ufw reload
ここまでデフォルトユーザーで作業してきたが、メールアドレスを作成(ユーザー作成)して作業する。
ユーザー作成
sudo useradd -s /sbin/nologin okamura
パスワード設定(ワンライナー)
pass=$(head /dev/urandom | tr -dc a-km-np-z1-9 | head -c 13); sudo echo okamura:${pass} | sudo chpasswd; sudo echo $pass;
ここでokamuraを作成した。
Maildir作成
/home/okamura/mail
にディレクトリを作成し、所有者を変更
sudo chown -R okamura:okamura okamura
・インストール
sudo apt install dovecot-common dovecot-pop3d
必要なら、 dovecot-imapd
・設定
etc/dovecot/conf.d
が基本ディレクトリ
IPv6をListenしない
sudo vim /etc/dovecot/dovecot.conf
listen = *
sudo vim /etc/dovecot/conf.d/10-master.conf
port = 110
プレーンテキスト認証も許可
sudo vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
ディレクトリを設定
sudo vim /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/mail
起動
sudo systemctl start dovecot
sudo systemctl enable dovecot
・ポート開放
sudo ufw allow from 192.168.12.2 to any port 110 proto tcp
sudo ufw status
VPNが192.168.12.1でクライアントが192.168.12.2
になっている状態で、
SMTP/POP3サーバー:192.168.12.1
ユーザーID:okamura
で接続できる。
sudo apt upgrade
にて、以下のようなメッセージがでた。
A new version of /boot/grub/menu.lst is available, but the version installed currently has been locally modified
選択肢としては以下。
・install the package maintainer’s verstion
パッケージメンテナのバージョンをインストール
・keep the local version currently installed
現在インストールされているローカルバージョンを保持
・show the differences between the versions
バージョン間の差異を表示
・show a side-by-side difference between the versions
バージョン間の差異を並行表示
・show a 3-way difference between available vertions
利用可能なバージョン間の3種類の差異を表示
・do a 3-way merge between available versions
利用可能なバージョン間での3種類マージを行う (実験的)
・start a new shell to examine the situation
状況を検討するための新しいシェルを起動
***
・install the package maintainer’s verstion
を実行したが、一応、
sudo vim /boot/grub/menu.lst
をメモしておくと。
●旧
title Ubuntu 18.04.1 LTS, kernel 4.15.0-43-generic
root (hd0)
kernel /boot/vmlinuz-4.15.0-43-generic root=LABEL=cloudimg-rootfs ro console=hvc0
initrd /boot/initrd.img-4.15.0-43-generic
title Ubuntu 18.04.1 LTS, kernel 4.15.0-43-generic (recovery mode)
root (hd0)
kernel /boot/vmlinuz-4.15.0-43-generic root=LABEL=cloudimg-rootfs ro single
initrd /boot/initrd.img-4.15.0-43-generic
●新
title Ubuntu 18.04.5 LTS, kernel 4.15.0-123-generic
root (hd0)
kernel /boot/vmlinuz-4.15.0-123-generic root=LABEL=cloudimg-rootfs ro console=hvc0
initrd /boot/initrd.img-4.15.0-123-generic
title Ubuntu 18.04.5 LTS, kernel 4.15.0-123-generic (recovery mode)
root (hd0)
kernel /boot/vmlinuz-4.15.0-123-generic root=LABEL=cloudimg-rootfs ro single
initrd /boot/initrd.img-4.15.0-123-generic
title Ubuntu 18.04.5 LTS, kernel 4.15.0-122-generic
root (hd0)
kernel /boot/vmlinuz-4.15.0-122-generic root=LABEL=cloudimg-rootfs ro console=hvc0
initrd /boot/initrd.img-4.15.0-122-generic
title Ubuntu 18.04.5 LTS, kernel 4.15.0-122-generic (recovery mode)
root (hd0)
kernel /boot/vmlinuz-4.15.0-122-generic root=LABEL=cloudimg-rootfs ro single
initrd /boot/initrd.img-4.15.0-122-generic
title Ubuntu 18.04.5 LTS, kernel 4.15.0-43-generic
root (hd0)
kernel /boot/vmlinuz-4.15.0-43-generic root=LABEL=cloudimg-rootfs ro console=hvc0
initrd /boot/initrd.img-4.15.0-43-generic
title Ubuntu 18.04.5 LTS, kernel 4.15.0-43-generic (recovery mode)
root (hd0)
kernel /boot/vmlinuz-4.15.0-43-generic root=LABEL=cloudimg-rootfs ro single
initrd /boot/initrd.img-4.15.0-43-generic
となった。
現在のカーネルのバージョン確認方法
uname -r
4.15.0-123-generic
最低限の部分
・PHP.ini
今回は、さくらのレンタルサーバーで利用している。
設置場所は、ドキュメントルートで、
echo phpinfo();
Loaded Configuration File
に反映される。
php.iniのパーミッションは600
追加内容は、
display_errors = Off
expose_php = Off
session.name = “hoge”
session.use_strict_mode=On
session.cookie_httponly=On
; HTTPSの場合
session.cookie_secure=On
allow_url_fopen = Off
file_uploads = Off
; post_max_sizeより大きくする
memory_limit = 20M
; upload_max_filesizeより大きくする
post_max_size = 20M
upload_max_filesize = 20M
・通常ファイル、ディレクトリのパーミッション
ファイル
604(もしくは644)
ディレクトリ
705(もしくは755)
・プログラム
リクエストにはワンタイムトークンを付加。
入力された値はサニタイジング。
最近LINE WORKSが自動起動しなくなった。
どうやら、
Windows起動時に自動実行する
をチェックすると、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
にエントリされるようだが、フルパスじゃなく実行ファイル名のみになっていた。
Get-ItemProperty -Path Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
フルパスに書き換えると、1度は自動起動するが、起動時にエントリを修正するようで、また実行ファイル名のみになってダメ。
他にも、
sysdm.cpl>環境設定>環境変数
からパスを通してみたけどダメ。
もともと正しく自動起動していたときにどういう値だったか見ていないので、どうしようもない。
再インストールは面倒なので、
Windows起動時に自動実行する
のチェックを外し、
shell:startup
にショートカットを登録した。
・無料SSL有効化
サーバコントロールパネルにログイン。
左側メニュー>ドメイン/SSL>ドメイン/SSL
をクリック。
対象ドメインにある
SSL
をクリック。
登録設定を始めるSSL証明書の種類を選択
をクリック。
Let’s Encrypt (無料SSL)
を選択する。
SNI SSL(ネームベース)
がチェックされ、
IPベースの証明書は新規でのご提供を終了いたしました、
とあるので、そのままでOK。
しばらくすれば完了。
***
・転送設定
SSL有効化が完了してから作業。
ドキュメントルートに.htaccessを設置するという方法もあるが、先程と同じく、
サーバコントロールパネルにログイン。
左側メニュー>ドメイン/SSL>ドメイン/SSL
をクリック。
対象ドメインにある
設定
をクリック。
HTTPSに転送する
にチェック。
ListBoxの使い方を忘れてしまうので、さっき作ったものをメモ代わり。
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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
Private Sub CommandButton1_Click() ' 検索 TextBox1.Enabled = False CommandButton1.Enabled = False Set w = Sheets("dat") r = 2 Do While w.Cells(r, 1).Value <> "" If TextBox1.Text = w.Cells(r, 1).Value Then TextBox2.Text = w.Cells(r, 3).Value TextBox3.Text = w.Cells(r, 10).Value TextBox4.Text = w.Cells(r, 11).Value TextBox5.Text = w.Cells(r, 17).Value Label7.caption = r CommandButton2.Enabled = True Call CheckDate Exit Sub End If r = r + 1 Loop TextBox1.Enabled = True CommandButton1.Enabled = True End Sub Sub CheckDate() On Error GoTo exception s = CDate(TextBox3.Text) e = CDate(TextBox4.Text) e = DateAdd("d", 1, e) ' 今日が開始日より後で終了日より前 If s < Now And e > Now Then Label8.caption = "OK" Else Label8.caption = "NG" End If Exit Sub exception: Label8.caption = "-" End Sub Private Sub CommandButton2_Click() ' 今日の日付を登録 Set w = Sheets("dat") If TextBox5.Text <> "" Then result = TextBox5.Text & ", " & Month(Now) & "/" & Day(Now) Else result = Month(Now) & "/" & Day(Now) End If If TextBox6.Text <> "" Then result = result & "(" & TextBox6.Text & ")" End If r = Label7.caption w.Cells(r, 17).Value = result TextBox5.Text = result ' CommandButton2.Enabled = False w.Activate w.Rows(r).Select MsgBox "登録しました。" End Sub Private Sub CommandButton3_Click() ' キャンセル TextBox1.Enabled = True CommandButton1.Enabled = True TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" TextBox5.Text = "" TextBox6.Text = "" Label7.caption = "" Label8.caption = "" CommandButton2.Enabled = False TextBox1.SetFocus End Sub Private Sub CommandButton5_Click() ' シート書き込み If ListBox2.ListCount = 0 Then Exit Sub yesNo = vbYes If TextBox2.Text = "" Then yesNo = MsgBox("氏名がありません。登録しますか?", vbYesNo) If yesNo = vbNo Then Exit Sub Set w = Sheets("売上") r = 1 Do While w.Cells(r, 4).Value <> "" ' 商品名で最終行を算出 r = r + 1 Loop targetRow = r memberCode = TextBox1.Text memberName = TextBox2.Text For r = 0 To ListBox2.ListCount - 1 productName = ListBox2.List(r, 0) unitPrice = ListBox2.List(r, 1) amount = ListBox2.List(r, 2) w.Cells(targetRow, 1).Value = DateTime.Now w.Cells(targetRow, 2).Value = memberCode w.Cells(targetRow, 3).Value = memberName w.Cells(targetRow, 4).Value = productName w.Cells(targetRow, 5).Value = unitPrice w.Cells(targetRow, 6).Value = amount targetRow = targetRow + 1 Next r w.Activate w.Rows(targetRow - 1).Select MsgBox "登録しました。" End Sub Private Sub CommandButton6_Click() ' クリア ComboBox1.Text = "" ListBox2.Clear Label12.caption = "" End Sub Private Sub UserForm_Initialize() TextBox1.SetFocus MasterSetup End Sub Sub MasterSetup() ' 商品リスト ListBox1.ColumnCount = 2 Set w = Sheets("master") r = 2 Do While w.Cells(r, 1).Value <> "" productName = w.Cells(r, 1).Value unitPrice = w.Cells(r, 2).Value ListBox1.AddItem "" ListBox1.List(ListBox1.ListCount - 1, 0) = productName ListBox1.List(ListBox1.ListCount - 1, 1) = unitPrice r = r + 1 Loop ' 売上リスト ListBox2.ColumnCount = 4 ' 数量 For i = 1 To 10 ComboBox1.AddItem i Next End Sub Private Sub CommandButton4_Click() ' 転送 If ListBox1.Text = "" Then MsgBox "商品を選択してください。" Exit Sub End If If ComboBox1.Text = "" Then MsgBox "数量を選択してください。" Exit Sub End If productName = ListBox1.List(ListBox1.ListIndex, 0) unitPrice = ListBox1.List(ListBox1.ListIndex, 1) amount = ComboBox1.Text ListBox2.AddItem "" ListBox2.List(ListBox2.ListCount - 1, 0) = productName ListBox2.List(ListBox2.ListCount - 1, 1) = unitPrice ListBox2.List(ListBox2.ListCount - 1, 2) = amount ListBox2.List(ListBox2.ListCount - 1, 3) = CDec(unitPrice) * CDec(amount) TotalPrice End Sub Sub TotalPrice() result = 0 For r = 0 To ListBox2.ListCount - 1 result = CDec(result) + CDec(ListBox2.List(r, 3)) Next r Label12.caption = "\ " & result End Sub |
ときどき利用しているWatchGuard VPN Clientの調子が悪く、接続プロセス中に止ってしまうことが多くなった。
情報も少なく原因追求もできなかったので、試しにOpenVPNのクライアントをそのまま使ってみようかと考えた。
https://www.openvpn.jp/download/
から
OpenVPN-x.x.x-I601-amd64.msi
をダウンロード+インストールし、
C:\Users\xxx\AppData\Roaming\WatchGuard\Mobile VPN
の中にある、
ca.crt
client.crt
client.ovpn
client.pem
の4つのファイルを、そのまま
C:\Program Files\OpenVPN\config
の中にコピーしたらOpenVPN GUIで接続できたので、しばらく使ってみる。
***
追記:数ヶ月利用してみた結果、OpenVPNの方が安定しているような感じで、一度も問題は発生しなかった。
一応、WatchGuardの方は、
https://software.watchguard.com/SoftwareHome
からFirebox and XTMの中で適当な製品を開き、
(Software for Firebox M270, M370, M470, M570 and M670)
Mobile VPN with SSL xx.x for Windows
の最新版をダウンロードして入れたら動くようにはなった。
***
追記:1年以上OpenVPNを利用したが特に問題なし。
少し気になったのが、VPNを有効にすると、ネット接続が全てVPN経由になってしまうこと。時々切断を忘れることもあるので、特定のIPアドレスの範囲だけVPN経由に変更。
NICのメトリックで対応できるかと思ったけど、接続を実行すると、
ネットワーク宛先 / ネットマスク / ゲートウェイ / インターフェイス
0.0.0.0 / 128.0.0.0 / 192.168.113.1 / 192.168.113.5
128.0.0.0 / 128.0.0.0 / 192.168.113.1 / 192.168.113.5
(192.168.113.5がVPNのNIC)
というルーティングが追加されてしまうようでダメだった。
ちなみに、もともと存在するデフォルトルートは、
0.0.0.0 / 0.0.0.0 / 192.168.11.1 / 192.168.11.18
(192.168.11.18が物理NIC)
OpenVPNの情報が少なく適当ではあるけど、
C:\Program Files\OpenVPN\config\client.ovpn
に、
route-nopull
route 192.168.0.0 255.255.248.0
と追加した。
(192.168.0.1~192.168.7.254までVPN経由)
client.ovpnの名前を変更して、*.ovpnを複数作成すると、タスクトレイのアイコンから選択して接続できる。
***
クライアントを2.5.8>2.6.0に上げたらエラーが出たのでエラーの内容から、client.ovpnに、
data-ciphers AES-128-CBC
と追加した。
***
;redirect-gateway def1
タイミングは不明だけどVPNオンのデフォルトルートが変わるようになってしまった。のようにコメントアウトすると大丈夫だった。
いつも忘れてしまうのでメモ。
右クリックメニューの階層化。高速化等々。
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 |
Dim caption As String Sub auto_open() On Error Resume Next caption = "会員検索フォーム" For i = 1 To 3 Application.CommandBars("cell").Controls(caption).Delete Next With Application.CommandBars("cell").Controls.Add .OnAction = "show_form" .caption = caption End With Call show_form 'With Application.CommandBars("cell").Controls.Add(Type:=msoControlPopup) ' .caption = "メニュー" ' With .Controls.Add(Type:=msoControlButton) ' .caption = "アイテム" ' .OnAction = "show_form" ' End With 'End With End Sub Sub auto_close() On Error Resume Next For i = 1 To 3 Application.CommandBars("cell").Controls(caption).Delete Next ' Application.CommandBars("cell").Controls("メニュー").Delete End Sub Sub Initialize() Application.ScreenUpdating = False Application.EnableEvents = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual ' 関数利用注意 End Sub Sub Finalize() Application.Calculation = xlCalculationAutomatic Application.DisplayAlerts = True Application.EnableEvents = True Application.ScreenUpdating = True End Sub |
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 |
<?php //error_reporting(-1); //ini_set('display_errors', 'On'); session_start(); if (isset($_POST["nn"]) && $_POST["token"] == $_SESSION["token"]) { $smtp = ""; $to = ""; $subject = "件名"; $message = "名前:" . h($_POST["nn"]); $from = ""; ini_set("SMTP", $smtp); ini_set("smtp_port","587"); mb_language("japanese"); mb_internal_encoding("UTF-8"); mb_send_mail($to, $subject, $message, "From:" . $from); echo "<script>(function(){alert('送信しました。');}());</script>"; } else { } $_SESSION["token"] = md5(mt_rand()); function h($s){ return htmlspecialchars($s, ENT_QUOTES, "UTF-8"); } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>お問い合わせテスト</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> </head> <body> <form action="" method="post" id="ff"> 名前:<input type="text" name="nn" id="nn"> <input type="submit" value="送信"> <input type="hidden" name="token" value="<?php echo $_SESSION["token"]; ?>"> </form> <script> $("#ff").submit(function(){ if($("#nn").val() == ""){ alert("名前の入力は必須です。") return false; } return true; }); </script> </body> </html> |