2020/08/19

centos7 sambaサーバにcifsでマウントする

windowsユーザの為に、samba

接続したい名前を検索する。

 # smbclient -L 192.168.0.xxx -U%


        Sharename       Type      Comment
        ---------       ----      -------
        info            Disk      hogehoge Utilities
        share           Disk      hogehoge
        share2          Disk
        share3          Disk
        IPC$            IPC       IPC Service (hogehoge)
Reconnecting with SMB1 for workgroup listing.

        Server               Comment
        ---------            -------

        Workgroup            Master
        ---------            -------
        WORKGROUP            hogeFile


マウントしたい先は、//192.168.0.xxx/share2 と分かった。

# mount //192.168.0.2/share2 /home/hoge/mnt/ -o username=<sambaの登録ユーザ名>,password=<その人のパスワード>

 マウント先でシンボリックリンクを有効にしたい際は、

 # mount //192.168.0.2/share2 /home/hoge/mnt/ -o username=<sambaの登録ユーザ名>,password=<その人のパスワード>,mfsymlinks

と末尾に ,mfsymlinksのオプションを付加すること。

 接続先のcifsのヴァージョン古い場合は、ver2.0等の追記が必要とのことだが、

デフォルト値で接続できたので、このまま運用する。

 接続解除

# umount /home/hoge/mnt

 

 

ディレクトリのパーミッション一括変更処理

新たなユーザと新たなグループを作成し、既存のディレクトリのパーミッションを
数百個一括で変換したい事案が出たので、オボエガキ

findを使ってディレクトリを絞ってパイプでxargsに投げる方法

 

# find /home/hogehoge/test -type d -user nobody -perm 0755 -print | xargs chmod 644


『/home/hogehoge/test』配下にある『nobodyユーザ』の
パーミッション『0755』のディレクトリを『フルパス形式の標準出力』にして
『パイプ』以降の 『xargs』コマンドを使って『フルパス形式の標準出力』に対して、
パーミッション『644』を定義する。

findコマンド
find <処理したいディレクトリの先頭> <オプション>
オプション
-type d ディレクトリファイルを検索
-user nobody ユーザnobodyのファイルのみ検索
-perm 0755 パーミッションが755のものを検索
-print 見つけたファイルをフルパスで出力

| xargs chmod 644
パイプ『|』の右側へ左側のコマンドを投げる
xargs 標準入力やファイルからリストを読み込み、コマンドラインを作成して実行
chmod 644 パーミッションを644に変更

同じような操作方法として、パイプを使わずに パイプ以降を
-exec chmod 644 {} + と記述する方法もあるが、

xargsよりもexecのほうが処理の手順が多く、ファイル数が多くなるほど負荷がかかるため、
基本はxargsを推奨とのこと。
コマンドの分かりやすさからも、xargsのほうがよさそう。

2020/07/28

phpmailer のSMTP送信で嵌った際の対処

表題に行きつくまで2時間ほど嵌ったのでオボエガキ

以前のphp5.4.16では何の問題もなく動いていたのだが
新しいサーバがPHP 7.2.21で稼働している。

PHP5.6から、verify_peerのデフォルトがtrueになったそうで、
SMTP認証をする際に、証明書を求められてエラーが返ってくる。
自己署名証明書も駄目っぽいので、証明書の設定をしないでSMTPを使いたいとき

verify_peerを使いませんと宣言すればよい
と先人は簡単に仰っていたが、ここに行きつくまで2時間かかった・・・。

$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);



以下、phpのサンプル

<?php

//----------
//メール作成
//----------

//PHPMailer ライブラリ読み込み
use PHPMailer\PHPMailer\PHPMailer;//PHPMailerの呼び出し
require_once("./vendor/autoload.php" );//位置は適宜設定のこと

mb_language("japanese");//言語設定、内部エンコーディングを指定mb_internal_encoding("UTF-8");

$files = "generate.csv";//アドレスは適宜設定のこと
//日本語添付メールを送るための設定
$to = "hoge@hoge.jp"; //宛先 必須
//$cc = "";
//$Bcc = "";
$subject = "メールのタイトル名";
$body ="本文\n";
$body.="添付のcsvファイルをご確認のこと。\n";
$body.="\n";
$from = "hoge2@hoge.com"; //送り主
$fromname = "送信者名";

//PHPMailerのインスタンス生成
$mail = new PHPMailer(true);//Exceptionを使う場合はtrueにする事使わないときは()でも動く
$mail->CharSet = "iso-2022-jp";
$mail->Encoding = "7bit";

//SMTPサーバ設定
$mail->IsSMTP();
//$mail->SMTPDebug = 0; // 0:デバッグOFF 1:デバッグON
$mail->SMTPAuth = TRUE;
$mail->Host = 'mail.hoge.jp:587';
$mail->Username = 'hoge';
$mail->Password = 'hogehoge';
$mail->SMTPSecure = 'tls'; //TLS
$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);
$mail->AddAddress($to);
//$mail->AddCC($cc);
//$mail->AddBcc($Bcc);
$mail->From = $from;
$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($fromname,"JIS","UTF-8"));
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");

//添付ファイル
$mail->AddAttachment($files);

//メールを送信
if (!$mail->Send()){
echo("Failed to send mail. Error:".$mail->ErrorInfo);
}else{
echo("Send mail OK.");
}


?>


このような記述で動作した。


後日追記
証明書を取得してpostfixのsmtpd_tls_cert_file などにPKCS12形式のcrtファイル
を配置し、テストしたところ、
verify_peerについての記述をしなくとも、正しく動いた。





twilio Enable Two-Factor Authentication (2段階認証)設定

Twilioから
[Action Required] You must enable Two-factor authentication on your Twilio accounts by October 12, 2020

というメールが来た。
中を見ると、2020年の10月12日からセキュリティ上2段階認証を要求します。
2段階認証を許容していないとロックアウトされてしまうので、設定変更してね
という内容だった。


    1.Login to Twilio Console
    2.Go to “User Settings” page (below your name on the top right corner) in Console
    3.In the "Enable Two-Factor Authentication (2FA)" section, select desired 2FA level
     and click “Update 2FA Settings” to save your selection.
    4.In the "Two-Factor Authentication (2FA) Methods" section, select the desired 2FA method
     and click “Update 2FA Method” to save your selection.
    5.Users enabling 2FA for the first time will be required to go through a one-time login
     and verification process with your new 2FA method of choice.

      手順に従って設定してみた。

      1.今までのようにログインする。
      2.右上のユーザー名をクリックして、User Settings画面に移動
      3.Enable Two-Factor Authentication (2FA) の
        30日毎に認証を選択し(毎回は流石に面倒と判断)
        Update 2FA Settings をクリック
      4.認証画面に飛ばされるので、 日本(+81)を選んで、ユーザ登録した際の
        sms番号(090-xxxx-yyyyなら90xxxxyyyy)を入力して送信
      5.携帯にsmsが飛んでくるので、認証コードを入力する。
      6.トラブル用の回復コードが飛んでくるので、携帯のsimが使えなくなった場合など
        の為に、メモっておいたほうがいいかも。
      7.無事ログインできた。

       メールにある、 In the "Two-Factor Authentication (2FA) Methods については、
      再度ログイン後に選択可能だったので、最初の一回目は テキストメッセージが
      飛んでくるようだ。
      認証コードを送信するための画面の説明は図入りの解説ページを設けても
      良いと思ったけど、twilioを使っている人は、全くの素人ではないだろうから
      自力で何とかするんだろう・・・。

      認証方法については、
      Authy app とあるので、アプリからの認証も出来る模様。
      https://apps.apple.com/jp/app/twilio-authy/id494168017 
      https://play.google.com/store/apps/details?id=com.authy.authy&hl=ja
      面白そうだけど、そもそもそんなにログインしないからテキストでいいや。

      2020/07/07

      inotifywait ディレクトリ監視から自動動作のサンプル

      ディレクトリ監視をして、業務効率化を図るべく、
      今更感満載ながらinotifywaitに手を出してみた。
      
      
      yumでインストールをする
      
      
      epelレポジトリにあるので、未導入時はepel-releaseをインストール
      # yum install epel-release 
       
      inotify-toolsをインストールする。
      # yum install inotify-tools 
      ヴァージョン確認 
      # inotifywait --help
      inotifywait 3.14
       
       
      動作は、ワンライナーでもOKだが、
      シェルスクリプトにて動作させたほうが、汎用性が高い。
       
      シェルスクリプトの例
      先駆者の方々の歴史を参考に
      今回は、pdftkと連携させ、監視ディレクトリにpdfファイルが新規作成されたら
      作業用ディレクトリに移動しPDFに作業済みスタンプを押して、
      作業済ディレクトリに保存という作業を想定。
       
      
      
      doSetStamp.sh
      
      
      ここから
      
      
      #!/bin/sh
      export PATH="/usr/local/bin:$PATH"#pdftkのパスを通す
      MONITORDIR="/home/hoge/work" #監視ディレクトリ指定
      ##スタンプは /home/hoge/stamp/back.pdfを想定
       
      inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
      do
        cd /home/hoge/work
        file=$(basename "${NEWFILE}" .pdf)
        mv "$file".pdf /home/hoge/work/"$file".pdf;
        cd /home/hoge/work/
        pdftk /home/hoge/work/"$file".pdf stamp ./stamp/back.pdf output /home/hoge/work/done/"$file"`date "+%Y%m%d"`.pdf;
        rm "$file".pdf
      done
      
      
      ここまで
      
      
      
      
      inotifywaitでなく、シェルのルールの問題だが、
      ダブルクオーテーションで括らないと、半角スペースでコマンドが止まってしまう。
      Windowsユーザが使うので、どうしても半角スペース問題は、加味しておかないと
      想定通りに動かない。
       
      バックエンドで動かす場合は、 
      $nohup doSetStamp.sh &
      のようにする。
      
      
      pdf以外のファイルをディレクトリに配置しない方法として、
      
      
      do~doneの制御にifで判別させて仕分ける方法が最も簡単だと思う。
      if [[ "$file" =~ .*pdf$ ]]; then  
       ここに動作させたい処理を書く; 
      else
       pdfファイル以外の処理を書く;  
      fi
       
       
      
      

      2020/05/14

      SPAM対策

      不覚にも、メールサーバのユーザパスワードが突破され、

      50件程度の踏み台にされてしまったので、対策を行った。

      先ずは、ユーザのパスワードを即座に変更

      # passwd <ユーザ名>
      Changing password for user <ユーザ名>.
      New password:
      Retype new password:
      passwd: all authentication tokens updated successfully.

      メーラー等の設定を修正する。

      スパム送信元のIPアドレスを探る。
        # tail -10000 /var/log/maillog | grep "LOGIN"
      May 14 05:29:03 www postfix/smtpd[xxxx]: xxxxxxxxxxxx: client=unknown[141.XXX.XXX.XXX], sasl_method=LOGIN, sasl_username=ごめんなさい・・・確かに、ヨーロッパのサーバ(ここも踏み台?)に突破されています。

      postfixに拒絶するIPアドレスを指定する。
      # vi /etc/postfix/main.cf

      末尾に
      smtpd_client_restrictions=
      permit_mynetworks,
      check_client_access hash:/etc/postfix/reject_ip,
      permit

      smtpd_client_restrictions で接続の許可、拒否の定義をする。

      permit_mynetworks, $mynetworksに書いたアドレスは許可する。

      check_client_access hash:/etc/postfix/reject_ip, 指定するipを拒否

      permit 上記以外を許可

      拒否するIPアドレス一覧を作成

      記載方法は、拒否したいIPアドレス、ドメイン + REJECTと記載。


      # nano /etc/postfix/reject_ip

      send.hogehoge.com REJECT
      141.XXX.XXX.XXX REJECT
      141.XXX.XXX REJECT

      reject_ipをDB形式に変換
      # postmap /etc/postfix/reject_ip

      Postfixをリロード
      # systemctl restart postfix

      設定が反映される。

      パスワードは、乱数生成が必須とまではいかないまでも、
      ある程度読まれないものにしないとだめだなぁ・・・
      突破されるとは思わなんだ・・・。

      2020/04/05

      slackの登録とbot起動 終了

      今更ながら、slackbotに手を出してみる

      参考にさせて頂いたところ
      https://se.miyabikno-jobs.com/entrance-labotlatori/

      Hubotを使う方法が簡単なようなので、上記を参考に導入

      01.slackのアカウント取得
      02.Hubotのアプリを追加
      03.HubotのAPIトークンを取得
      04.pythonのライブラリ slackbotをインストール
         $ sudo apt-get install python-3-pip
         $ sudo pip3 install slackbot
         $ mkdir slackbot
         $ cd slackbot
      05. $ touch slackbot_settings.py bot.py botmodule.py
         ・slackbot_settings.py:Botの設定を書くためのファイル(名称変更不可)
         ・bot.py:Botを起動するための実行ファイル(名前は任意)
         ・botmodule.py:Botの応答を記述するためのモジュール(名前は任意)
      06.$ nano slackbot_settings.py

      # 「API_TOKEN」にはSlackから取得したAPIトークンを記述
      API_TOKEN = "XXXXXXXXXXXXXXXXXXX"
      # 知らない言葉を聞いた時のデフォルトの応答
      DEFAULT_REPLY = "その言葉の意味は学習していません"
      # 外部ファイルを読み込む。botmodule.pyを読込
      PLUGINS = [
      'slackbot.plugins',
      'botmodule',
      ]

      07.$ nano bot.py

      from slackbot.bot import Bot
      # Botを起動する
      def main():
      bot = Bot()
      bot.run()
      if __name__ == "__main__":
      main()

      08.$ nano botmodule.py

      from slackbot.bot import respond_to
      from slackbot.bot import listen_to
      # 「respond_to」はメンションする(@でターゲットを指定すること)と応答する
      @respond_to('よろしく')
      def greeting_1(message):
      # Slackに応答を返す
      message.reply('よろしくお願いします!')
      # 「listen_to」はメンションがなくても応答する
      @listen_to('コニチハ')
      def greeting_2(message):
      message.reply('コニチハ')

      09.$ nohup python3 bot.py &
        ssh接続を切っても稼働するようにnohup ~ &で起動
            再度sshで接続し、プロセスを停止さえたい場合は、
            $ ps x
            にて pyhon3 bot.py のプロセスidを調べて、
        $ kill -9 
           として停止させる。

      ログインシェルがsshを閉じる際にSIGHUPを投げるため、プロセスが終了してしまうと思っていた。
      nohupはSIGHUPのシグナルハンドラをSIG_IGNに設定、つまり「受信しても無視」する設定にして、コマンドラインで指定されたジョブを実行している。 
      nohupで起動した時点ではRUNNNINGだが、端末が閉じられた後、標準入力に対してread()するようなプログラムでは、(5分ごとに読みなおしなどの動作が入るもの)はcloseしてしまっていて、
      EOFを返してきてしまう。


      nohupを使わなくても停止しないケースもあるようだが、説明が難しい。
      非常に詳しくテストされた解説が掲載されている
      https://www.glamenv-septzen.net/view/854
      実際は、SIGHUPのデフォルト処理はプロセス終了となっており、SIGHUPの受信にかかわらず、プロセスが終了するとき、そのプロセスがセッションリーダーだった場合、カーネルからそのセッションのフォアグラウンドプロセスグループに対してSIGHUPが送信されるらしい。
      また、カーネル側で放置しているバックグラウンドジョブに対しても、シェル(bash)側で終了時にSIGTERM/SIGCONTを送信する事があるためというのが実態のようだ。