投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2015年5月27日水曜日

CANON製レーザープリンタドライバとOpenOfficeやLibreOfficeの用紙設定に相性問題があるのではないか

更新 2020年3月4日

純正のプリンタドライバをインストールしたWINDOWSマシンやLINUXマシンにおいて、
OpenOffice、LibreOfficeでの用紙設定がうまくされない、(プリントアウトウィンドウでのプレビュー)
また実際に間違った向きでプリントアウトされる問題についてのメモ。

キャノン製プリンタはTCP/IPでネットワーク経由で利用している。



■不具合が生じた環境■

Windows / Linux それぞれ、複数のPCでいくつかの関連しそうな現象を確認できた。

<Windows環境>
Windows 7 pro 64bit
Windows 8.1 pro 64bit

・キャノンプリンタドライバ
LIPS LX プリンタードライバー (64bit) Ver.21.45 < winlipslxver2145x6400.exe >

・キャノンプリンタ (TCP/IPでネットワーク経由)
手差しトレイにA5用紙をセットし、設定済み
LBP8710e
LBP8610

・オフィスソフトウェア(A5横向き文書のプリントアウト要求)
LibreOffice 5
LibreOffice 4 (LibreOffice 4.3.7)
OpenOffice 3


<Linux 環境>
CentOS 6.6 64bit
(2.6.32-504.16.2.el6.x86_64 #1 SMP Wed Apr 22 06:48:29 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux)

・キャノンドライババージョン
LIPS4 Printer Driver for Linux Ver.2.90 (64bit)
< linux-lipslx-printerdriver64-v290.tar.gz >

・キャノンプリンタ(TCP/IPでネットワーク経由)
手差しトレイにA5用紙をセットし、設定済み
LBP8710e

・オフィスソフトウェア(A5横向き文書のプリントアウト要求)
LibreOffice 4 (LibreOffice 4.0.4.2-14.el6)



■問題の内容■

上記のとおり、LibreOfficeや、OpenOfficeソフトからプリントアウトを行ったときに問題が生じた。


○Windows環境におけるプレビューとプリントアウトの問題

キャノン製プリンタを導入しPCにプリンタドライバが導入されている環境(上記のような環境)で、
OpenOffice、LibreOffice(表計算ソフトウェア)から、キャノンプリンタへA5サイズの文書をプリントアウトするとき次の問題が生じた。

テストした文書はA5サイズ(横)、
出力先のLBP8710eの手差しトレイには、A5サイズが設定されている。

プリントアウトウインドウにおいて、文書ページ自身に設定された用紙設定がプレビューに正しく反映されない。
そして、実際にプリントされる用紙の向きが正しくない。
(Windows標準の「Fax」「XPS Document Writer」を出力先としてセレクトしたとき、この問題は生じない。文書に応じて正しい向きの用紙でプレビューできた。)

古いキャノンプリンタドライバが導入されているPCにおいては、不正なプレビュー時にプリンタ設定で用紙の向きをセットすることによって、正しいプレビューとプリントアウトを得られた。
しかし、ここに上記の新しいドライバでプリンタを追加すると、問題が生じるようになった。
文書の縦横の向きを正そうとしても、プレビューに反映されなくなった。



○Linux環境におけるプリントアウトの問題

印刷ウインドウでのプレビューが正しくても、プリントアウトすると用紙の向きがおかしい。
テストした文書はA5サイズ(横)、
出力先のLBP8710eの手差しトレイには、A5サイズが設定されている。
A5サイズ(横)文書のプレビュー段階では正常だとしても、実際にLBP8710eへプリントアウトすると縦横の向きがおかしく、一部しかプリントされない。

カセットにA5用紙が設定されているiR C2550カラーレーザープリンタにプリントアウトしたときは、
正しい向きでプリントアウトされた。(手差しトレイでは試せていない。)



■問題を避ける方法について■(その3)

LibreOfficeの各文書で、ページスタイルの用紙サイズを変更する方法

うまくプリントアウトできなかったA5サイズ(横向き)のCalc文書を開き、
そして、上部メニューの「書式」から「ページ(P)」を開いた。
次の図のウインドウが開くので、次の手順で編集した。

1、用紙サイズの「サイズ名(F)」で「A5」を選択し、
「印刷の向き」を「横(A)」に設定した。(下の図)


2、次に、用紙サイズの「高さ(H)」を、14.85 cm に変更した。
そうすると、自動的に、サイズ名は”ユーザー”に変更された。(下の図)


3、「OK」ボタンをクリックし、必要があれば文書を上書き保存しておく。


以上により、文書に設定したサイズを示す枠線が現れた。

後は、いつものようにプリントアウト操作を行うと、正しくプレビューが表示されA5でプリントアウトできた。


原因は、下記参考サイトの方がおっしゃっているように、
キャノンプリンタードライバのA5の用紙サイズと、LibreOfficeのA5の用紙サイズとが不一致になっているからではないかと考えられる。



■問題を避ける方法について■(その2)

次の組み合わせで、下記の問題を避けることができた
A5横向き文書のプリントアウトができるようになった。


テストOS環境は、Windows 8.1 64bit

・キャノンプリンタドライバ
GLX プリンタードライバー (64bit) Ver.2.12 (機種共通プリンタードライバー)

・オフィスソフトウェア(A5横向き文書のプリントアウト要求)
Apache OpenOffice 4.1.2 日本語版
(Libre Officeも試したが、これは変わらず不可だった。)



■問題を避ける方法について■(その1)

OpenOffice、LibreOfficeからキャノンプリンタへ直接プリントアウトをしないで、
OpenOffice、LibreOfficeドキュメントをPDF化してから、別ソフトウェアからプリントアウトする
PDFファイルは、Adobe ReaderやWindows標準ソフトで開いて、プリントアウトした。
用紙サイズや向きが間違っている場合は、ここで設定変更した。



(参考)
・A5横のドキュメントが印刷されなかった(解決済み)
< http://document-foundation-mail-archive.969070.n3.nabble.com/A5-td4264939.html > 2020年3月4日

2015年5月24日日曜日

【Linux CentOS 6.6 64bit】VNC SERVERの起動中、SElinuxがtimeout in locking authority file.(Xauthority)を引き起こし起動に失敗した【tigervnc-server 1.1.0】

旧いマシンから新しいマシンに移行作業をしていた。
旧いマシンの/homeの内容を新しいマシンに移行することで、ユーザー環境を引き継いだ。

ところが、tiger-vncserverの起動中(service vncserver start)に、次のエラーが表示された。
時間がかかった後にコマンドは終了した。
VNCクライアントで対象の画面を表示させると、真っ暗になっていて、×印のマウスカーソルが表示されていた。

(エラー文)
33:testuser xauth: timeout in locking authority file /home/testuser/.Xauthority

.Xauthorityに対するパーミッションも正常である。

結局、SElinuxの切り忘れが原因だった。

次のページの方法で、SElinuxを無効にした。(再起動が必要)

http://akira-arets.blogspot.jp/2012/03/centos6-disabled-selinux.html



また、試行錯誤する段階で、.Xauthorityを削除してしまっていたが、
再び、service vncserver startを実行することによって、次のように表示されて自動生成された。
33:testuser xauth:  creating new authority file /home/testuser/.Xauthority

そうして、無事にGNOMEの画面を得られた。

2015年5月23日土曜日

【SAMBA 3.6.23 x86_64】SAMBAサーバーを新規マシンに移行する方法について(SAMBAユーザーアカウント情報tdbsamの移行方法)【Linux CentOS 6.6 64bit】

(不具合が発生するかもしれないので注意)
以下の方法でsambaユーザー情報を複製したシステムで、下記のように不具合が生じた。
ただし因果関係があるかどうかはっきりしない。

数ヵ月動作させていると、次第にsambaに新規に接続するユーザーの認証が遅くなっていった。
これは次第にひどくなっていって、最終的にはタイムアウトするようになってしまった。
 この問題は再起動によって一度は回復したものの、また後になって、
次のように、急に認証不能状態に陥ってしまった。

新規に接続するユーザーは認証に成功せずにタイムアウトになる。
この場合でも、既に認証を済ませているユーザーは、問題なく使用し続けることができていた。
このときには、sambaの再起動、マシン全体の再起動によっても回復しなかった。
データは無事であった。

ただし、この件について、数か月後に問題が生じるようになったこともあり、
因果関係は明らかではない。

これを受けて、今後は下記のような方法をとらずに、
1ユーザーずつ pdbedit -a コマンドで追加していこうと考えている。



新しいマシンに新規にOSを導入した後、古いマシンで動作していたSAMBA環境を移行した。


■前提事項

・SAMBAのユーザー管理は、tdbsamで行っているものとする。
(security = user
 passdb backend = tdbsam)

・新しいマシンにおいて、SAMBAがインストールされて、アクセス可能な状態になっていること。
(iptables、selinuxなどに注意)

・新しいマシンに、共有対象ファイルが適切な場所に、かつ適切な所有者や権限で移行されていること。
(rsyncで行った。)

・新しいマシンにおいて、passwd、shadow、group、gshadowのリストアが問題なく行われていること。
(絶対に単純に古いファイルによって置換してはいけない。500番以降の情報のみ扱った。)

・新しいマシンにおいて、SAMBAサービスが停止していること。



■SAMBA設定ファイルのリストア

移行先の新しいマシンにおいて、次の操作を行った。


1、オリジナルのsamba設定ファイルをつぎのようにしてディレクトリごとバックアップした。
# mv /etc/samba /etc/samba.org

2、旧来の設定ファイルをコピーした。(ファイルの所有者、権限に注意)
# cp backup/samba /etc/ -r



■SAMBAユーザーアカウントデータベース(tdbsam password database)のリストア

移行先の新しいマシンにおいて、次の操作を行った。


1、データーベースが保存されている場所を調べた。
# smbd -b | grep PRIVATE_DIR
PRIVATE_DIR: /var/lib/samba/private

2、オリジナルのtdbファイルを次のようにしてバックアップした。
# mv /var/lib/samba/private/passdb.tdb /var/lib/samba/private/passdb.tdb.org


3、旧来のデータベースファイル(backup/passdb.tdb)をコピーした。
(ファイルの所有者、権限に注意)
# cp backup/passdb.tdb /var/lib/samba/private/passdb.tdb



■動作確認

○ユーザーアカウントが保持されているか確認した。

次のコマンドで、アカウント一覧が表示された。
# pdbedit -L


○SAMBAサービスを起動し、アクセスできるか確認した。

サービスの起動を行った。
# service smb start

問題なくサービスが起動して、登録されているユーザーでアクセスすることができた。



<参考>
・[Samba] Where is the tdbsam password database file?
< https://lists.samba.org/archive/samba/2007-September/135288.html >

2015年5月19日火曜日

Windows 8.1(UPDATE)インストーラーをフラッシュメモリに書き込んでインストーラーを起動できるようにする方法

Windows 7(sp1) pro 64bit版で作業を行った。


用意したもの:

・Windows のインストール用DVDメディア(今回は、Windows 8.1 UPDATE pro 32bit版を用意した。)
4GB以上のフラッシュメモリ(今回はUSBディスクを使った)

フラッシュメモリは、フォーマットに時間がかかるため、インストーラーが収まる最少の容量のものを使った。


作業手順:
(0)準備
(1)リムーバブルディスクの選択とフォーマット。(注意!フォーマットには時間がとてもかかる。)
(2)USBディスクのブートセクタに起動用のコードを書き込む。
(3)インストーラーDVDの内容をUSBディスクに書き込む。



(0)コマンドプロンプトを管理者権限で起動した。

スタートボタンを押し、「すべてのプログラム」→ 「アクセサリ」を開き、
その中の「コマンドプロンプト」項目上で、右クリックメニューから「管理者として実行(A)」を選ぶ。

コマンドプロンプトウインドウが起動した。


リムーバブルUSBディスクを、USBポートに取り付けた。



(1)次の手順で状況を確認しながら、リムーバブルディスクを選択しフォーマットを行った。

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.


●diskpartコマンドを起動した。
C:\Windows\system32>diskpart

Microsoft DiskPart バージョン 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター: PC NAME

○list volumeコマンドで、ボリューム状態を確認した。
DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0    D                      DVD-ROM         0 B  メディアなし

  Volume 1        システムで予約済み    NTFS  Partition    100 MB  正常       シ
ステム
  Volume 2    C                NTFS  Partition    146 GB  正常       ブート

  Volume 3    E   ボリューム        NTFS  Partition     86 GB  正常

  Volume 4    F   Lexar        FAT32 リムーバブル      7646 MB  正常

●list diskで、リムーバブルディスクのディスク番号を確認し、選択した。
(注意!間違えると、ハードディスクの内容を喪失してしまう!)

DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           232 GB  1024 KB
  ディスク x    オンライン          7648 MB      0 B  ( ←これがUSBディスク )

DISKPART> select disk x ( ←実際には、環境に応じて番号を入力する )

ディスク x  が選択されました。

○選択したディスクのパーティションの状態を確認した。
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 1    プライマリ             7646 MB  1132 KB

●cleanコマンドを実行した。(既存のパーティションが消えるので注意!)
DISKPART> clean

DiskPart はディスクを正常にクリーンな状態にしました

○パーティションの状態を確認した。
DISKPART> list partition

このディスクには表示するパーティションがありません。

●パーティションを作成した。
(このコマンドの使い方の確認)
DISKPART> create

Microsoft DiskPart バージョン 6.1.7601

PARTITION   - パーティションを作成します。
VOLUME      - ボリュームを作成します。
VDISK       - 仮想ディスク ファイルを作成します。
DISKPART> create partition

Microsoft DiskPart バージョン 6.1.7601

EFI         - EFI システム パーティションを作成します。
EXTENDED    - 拡張パーティションを作成します。
LOGICAL     - 論理ドライブを作成します。
MSR         - Microsoft 予約パーティションを作成します
PRIMARY     - プライマリ パーティションを作成します。

DISKPART> create partition primary
DiskPart は指定したパーティションの作成に成功しました。

●作成したパーティションを確認し、アクディブにした。
DISKPART> list partition

  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
* Partition 1    プライマリ             7647 MB  1024 KB
DISKPART> active

DiskPart は現在のパーティションをアクティブとしてマークしました。

●パーティションをフォーマットした。
DISKPART> format fs=fat32

   30% 完了しました

  100% 完了しました

DiskPart は、ボリュームのフォーマットを完了しました。

●ドライブレターを割り当てた
(システムに認識されて、内容表示のためのウインドウが開ける)
DISKPART> assign

DiskPart はドライブ文字またはマウント ポイントを正常に割り当てました。

○システムのディスク状態を確認した。

Gドライブとして認識されていることがわかった。
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           232 GB  1024 KB
* ディスク 1    オンライン          7648 MB      0 B

DISKPART> list volume

  Volume ###  Ltr Label        Fs    Type        Size     Status     Info
  ----------  --- -----------  ----  ----------  -------  ---------  --------
  Volume 0    D                      DVD-ROM         0 B  メディアなし

  Volume 1        システムで予約済み    NTFS  Partition    100 MB  正常       シ
ステム
  Volume 2    C                NTFS  Partition    146 GB  正常       ブート

  Volume 3    E   ボリューム        NTFS  Partition     86 GB  正常

* Volume 4    G                FAT32 リムーバブル      7647 MB  正常


DISKPART>

●CTRL + Cで、diskpartコマンドを終了した。



(2)USBディスクのブートセクタに起動用のコードを書き込んだ。

DVDドライブ(dドライブ)にWindows 8.1のインストーラーDVDをセットした後、DVDドライブに切り替えた。
C:\>d:
さらに、bootフォルダへカレントディレクトリを切り替えた。
D:\>cd boot

専用コマンドでUSBドライブにブートコードの書き込みを行った。
(例では、GドライブがUSBディスクに割り当てられているので、注意。)
D:\>bootsect.exe /nt60 g:
Target volumes will be updated with BOOTMGR compatible bootcode.

G: (\\?\Volume{12345678-1234-1234-1234-123456789abc})

    Successfully updated FAT32 filesystem bootcode.

Bootcode was successfully updated on all targeted volumes.

(3)インストーラーDVDの内容をUSBディスクに書き込んだ。
(この例では、Windows 8.1 DVDディスクはDドライブ、書き込み先のUSBディスクはGドライブになっているので注意!)
D:\>robocopy d: g: /E

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー

-------------------------------------------------------------------------------

  開始: Tue May 19 00:00:00 2015

   コピー元 = D:\
     コピー先 = G:\

    ファイル: *.*

  オプション: *.* /S /E /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------
------------------------------------------------------------------------------
(表示省略)


以上で、Windows 8.1 インストール用のUSBディスクが完成した。

これを使ってインストーラーを起動するには、ターゲットPCのBIOS設定において、
USBポートから起動できるように変更を要する場合がある。

2015年5月9日土曜日

【Linux CentOS 6.5 64bit】ディレクトリ内のファイルに対して一気に特定の処理を施す方法【sedによる行丸ごと置換と上書き保存】

ディレクトリ内のファイルを一気に処理するための型 

for f in `find . -maxdepth 1 -type f` ; do 「処理内容 $f ; done

注意: 「`」は、「shift + @」で入力すること。


(説明)
find . -maxdepth 1 -type f によって、カレントディレクトリに限定して全ファイル名を取得する。
(-maxdepth 1 をはずすと、下階層にまで下ってファイル一覧が取得される。)
その取得されたファイルリストを使って「for f in」でループ処理させ、一気に処理を行う。

ところで、-maxdepth のオプションの位置に注意。間違えると次の警告文が現れた。
-maxdepthはオプションだが、-typeはオプションではない。 オプションは、他の要素の前に置くこと。
find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.


(「処理内容」の例)
テキストファイルの特定の行(文字列で指定される行)を別の文字列 で置換するため、
sedの次のコマンドを用いた。
c \text
Replace the selected lines with text,
which has each embedded newline preceded by a backslash.

選択される複数行がそれぞれ、”バックスラッシュ(「\」)を前置して指定されたテキスト”で置換され、行は更新される。

次のようにコマンドを作成した。
sed -i -e '/server/c\server          127.0.0.1' 処理されるファイル名
serverを含む行を、「server          127.0.0.1」という文字列の新しい行に置換する。
オプション -i によって、処理されるファイルは上書き 保存されるので注意!



ディレクトリ内のファイルを一気に処理するコマンドをとして、次のように作成した。
念のために、echo"処理内容"として、動作を確認するようにした。

for f in `find . -maxdepth 1 -type f` ; do echo " sed -i -e '/server/c\server          127.0.0.1' $f " ; done

注意: 「`」は、「shift + @」で入力すること。

これによって、実際に実行されるコマンド文字列が一覧できる。
コマンドが正しいことが確認できたら、echo "処理" から、echo""を取り外して、
実際に処理が行えるようにする。



(参考)
・sed cコマンドの動作 (指定文字列で行を置き換え) 【Linuxコマンド】
< http://blog.livedoor.jp/morituri/archives/52018209.html > 2015年5月9日

・man sed

・sedでファイルを上書き保存
< http://www.dab.hi-ho.ne.jp/sasa/biboroku/unix/sed-i.html > 2015年5月9日

2015年5月4日月曜日

【Linux CentOS 6.5 64bit】強制的にroot権限でスクリプトを動作させる方法

<追記 2020年11月7日>

 以下の方法は、CentOS 7 では動作しなかった。
代わりに、sudoを導入(yum install sudo)し、visudoでroot動作させる設定を行えた。
visudoを用いた設定方法は、下記を参考にしてください。


sudoを用いてroot権限で動作させるには、以上の設定の上、対象のコマンドやスクリプトの前に、sudoを前置させる必要がある。



※注意※
以下の方法はあくまでも、安全なローカル環境下、一般ユーザが使用しない環境で試すものです。


あるスクリプトが通常ユーザ権限で動作する場合、
その内部に「root権限が必要な処理」が記述されていると、失敗してしまう。


こういうとき、たとえば次のようにして制限を回避できる。

「root権限が必要な処理」だけ別プログラムとしてファイルに分離し、
SUID(=setuid)をそのファイルに設定し、所有者をrootに設定する。
SUIDが設定された実行ファイルは、
呼び出し元のスクリプトの実行権限に関係なく所有者の権限(この場合はroot)で動作する。
そして、これを元のスクリプトから呼び出すようにすればよい。

しかし、CentOS 6.5では、
スクリプトファイルにsetuidを設定しても、ファイル所有者権限で実行されなかった


そこで、さらに次のようにしてこの制限を回避した。

スクリプトを呼び出して実行するだけのバイナリプログラムを作成し、
これにSUIDを与え、所有者をrootとする。
これによって呼び出されたスクリプトは、root権限で動作することになる。


大元のスクリプト(通常ユーザで動作)
  ↓
  ↓呼び出し
  ↓
バイナリプログラム(SUIDにより、root権限で動作)
  ↓
  ↓呼び出し
  ↓
スクリプト (root権限で動作)



■次のように、C言語でプログラムを作成した。

(内容の説明)

引数として5つの文字列が指定できる。
sprintf関数で、それら引数を一つの文字列にフォーマットして、変数buffに格納する。

最初の引数は、root権限で実行させたいスクリプトへのパスを記述する。
2~5までの引数は、「そのスクリプトに渡す引数」をそれぞれ記述する。
したがって、これらが一つの文字列にフォーマットされると、
スクリプト名を先頭に引数を連ねた「コマンド文字列」が生成される。

setuid関数でrootを指定した上で、system関数にこの「コマンド文字列」を渡し実行させる。


[root@test etc]# vim caller-script-4arg.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc,char *argv[])
{
        char    buff[100];

        sprintf(buff,"%s %s %s %s %s",argv[1],argv[2],argv[3],argv[4],argv[5]);

        setuid( 0 );
        system(buff);

        return 0;
}

■コンパイルした
[root@test etc]# gcc caller-script-4arg.c -o caller-script-4arg


■実行できるようにした
[root@test etc]# chmod +x caller-script-4arg


■さらにSUIDを設定した
これによって、このバイナリファイルは「ファイル所有者(=root)の権限」で、実行される。

[root@test etc]# chmod u+s caller-script-4arg

○ls -all コマンドの結果
-rwsr-xr-x  1 root root    6841  4月 17 00:00 2015 caller-script-4arg
-rw-r--r--  1 root root     256  4月 17 00:00 2015 caller-script-4arg.c

これはあくまでも実験である。全てのユーザーに、このバイナリの実行権限を与えるべきではない


■動作確認
大元のスクリプトにおいて次のようにして記述した。(2例)
作成したバイナリプログラム(root, SUID)に、「test.shとその引数」を、5つの引数として与えた。
(test.shにも実行属性を与えておくこと。)

/etc/caller-script-4arg "/etc/test.sh" "uucp:${admittedgroup}" "${SAVETObase0DIR}" "750" " "

/etc/caller-script-4arg "/test/test.sh" "uucp:${admittedgroup}" "${SAVETODIR}" "770" "-R"

test.sh内には、chmodや、chownが含まれていたが、
root権限でtest.shが実行されたので、うまく処理ができるようになった。



(参考)
・setuid on shell scripts
< http://www.tuxation.com/setuid-on-shell-scripts.html > 2015年5月4日

・sprintf
< http://www9.plala.or.jp/sgwr-t/lib/sprintf.html > 2015年5月4日

・UNIX処方箋:SUIDとは
< http://www.itmedia.co.jp/enterprise/articles/0804/08/news014.html > 2015年5月4日

・setuid は慎重に
< http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b07_03.html > 2015年5月4日

2015年5月1日金曜日

【Postfix 2.6.6 x86_64】リレーの設定について【Linux CentOS 6.5 64bit】

更新 2020/07/18 フォールバックリレーについて


下記の図式が示す構成において、Postfix( localhost )を経由してメール送信した際の考察と、
上位SMTPメールサーバへメールをリレーさせるための設定方法について


[SMTPserver( B.domain.tld )]---[SMTPserver( A.domain.tld )]---[※Postfix(-sendmail)]---[Clientマシン]

※ホスト名を仮に、postfix.local.tld としておき、Clientマシンから名前解決できるようにしておく。


下記情報を踏まえたうえで、さらにSTARTTLSでリレー先SMTPサーバに接続したい場合や、
複数のリレー先を用意しておいて、バックアップとして用いたい場合は、次のページを参照
http://akira-arets.blogspot.jp/2016/02/postfix-relay-starttls.html


■Postfixに、relayhost の設定は行わない場合の動作テスト

その場合は、メールのあて先へ直接届けられる。(main.cfに書かれた下記のコメント参照)
# The relayhost parameter specifies the default host to send mail to
# when no entry is matched in the optional transport(5) table. When
# no relayhost is given, mail is routed directly to the destination.
<実験>
1、Postfixローカルにおいてsendmailコマンドで、someone@A.domain.tld へメールを送ることができた。
(ただし、gooleのgmailのアカウントへ送信すると、spamメールとして扱われた。)

外部のメールサーバ(A.domain.tld)は、「自身が管理するメールボックス宛のメール」を受け取った。


2、ClientマシンからPostfixへSMTPで、root@postfix.local.tld 宛メールを送ることはできた。

Postfix(postfix.local.tld)は、自分が管理しているメールボックス宛メールを受け取った。
/var/spool/mail/root に送達されたメールを確認できた。


3、ClientマシンからPostfixへSMTPで、someone@A.domain.tld 宛メールを送信しようとすると、失敗した。

このとき、次のエラーがPostfixで発生した。
postfix/smtpd[7218]: NOQUEUE: reject:(略)Relay access denied
リレーを要する送信アクセスは初期設定では受け付けないわけだ。



■Postfix( local )に、relayhost の設定を行った

Postfix(10.10.10.10)が上位のメールサーバ(A.domain.tld)へリレーできるように設定を行った。

下記のようにして、Clientマシンが属するネットワークアドレス(192.168.0.0/16)を記述した。
Postfix自身のアドレス(10.10.10.10/32と127.0.0.0/8)もしくはネットワークアドレスも含むようにすること。
(間違えると、Postfixは起動しなくなる。)

# vim main.cf
(略)
mynetworks = 10.10.10.10/32, 127.0.0.0/8, 192.168.0.0/16
(略)
relayhost = A.domain.tld:587 (←サブミッションポートを使用するのでポートを指定した)
(略)

以上、リレーを許可する設定を行った後に、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。

すると、ClientマシンのMUAでは、エラーは発生しなかったが、
しかし、Postfixのログ、/var/log/maillog を確認 すると、次のエラーが発生して送信に失敗していた。
Postfixは、relayhostとして設定した A.domain.tld:587 へ接続を試みたが、認証に失敗したようだ。
(host A.domain.tld[xxx.xxx.xxx.xxx] said: 530 AUTH first (#5.5.1)


そこで、 relayhost である A.domain.tld:587 へ接続するための認証情報を設定した。



・認証情報を作成した。

次のようにして認証情報を適当な名前のファイルに挿入した。(複数追加可能)
# echo "A.domain.tld:587 account:password" > /etc/postfix/relay_password

作成したファイルをハッシュ化した。
(後で示すように、このファイルを指定するときhashを指定する必要がある。)
# postmap /etc/postfix/relay_password

# ls relay_password.db
relay_password.db

作成したデータベースが正常かを確かめた。
データベースに対して、クエリーを発行し認証情報が記録されているか確認をした。
# postmap -q A.domain.tld:587 /etc/postfix/relay_password
account:password



・main.cf に認証のための設定を追加した。
(エディタでもよいが、ここでは専用のコマンドで設定を行った。)

上記で作成した認証情報データベースを登録した。
# postconf -e smtp_sasl_password_maps=hash:/etc/postfix/relay_password
念のために確認すると、確かに、main.cf に次の設定を見つけられた。
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
# postconf -e smtp_sasl_auth_enable=yes
# postconf -e smtp_sasl_security_options=noanonymous



■上位SMTPサーバへリレーさせる動作テストを行なった

ここまで設定して、service postfix restart を行ってから、
ClientマシンのMUAから、someone@A.domain.tld 宛へメールを送信テストを行った。

これで、上位サーバへリレーされるはずだと期待したが、
Postfixにおいて、次のエラーが発生して、送信に失敗した。
(SASL authentication failed; cannot authenticate to server A.domain.tld[xxx.xxx.xxx.xxx]: no mechanism available)
warning: SASL authentication failure: No worthy mechs found

googleで調べると、
上位SMTPサーバの種類によっては、さらにパッケージの導入が必要であるらしいことがわかった。


■プレインで認証するSMTPサーバにリレーするために必要なパッケージをインストールした

PLAINで認証情報が交換されるSMTP上位サーバとの通信のために必要なパッケージを追加した。
# yum install cyrus-sasl-plain

Name        : cyrus-sasl-plain
Arch        : x86_64
Version     : 2.1.23
Release     : 15.el6_6.2
Size        : 31 k
Repo        : updates
Summary     : PLAIN and LOGIN authentication support for Cyrus SASL
URL         : http://asg.web.cmu.edu/sasl/sasl-library.html
License     : BSD
Description : The cyrus-sasl-plain package contains the Cyrus SASL plugins which support
            : PLAIN and LOGIN authentication schemes.

# postconf -e smtp_sasl_mechanism_filter=plain,login


そうして、さらに動作テストを行った。

■結果
ClientのMUAからPostfixへSMTPで送信したメールは、
このPostfixによってさらに上位にあるSMTPサーバーへリレーされて、
冒頭の図式に挙げた、A.domain.tldや、B.domain.tldのメールボックスに到達した。


■結果(Gmaiのメールボックス宛メールの場合)

ただし、gmailのメールボックスに到達したメールはspam判定された。(到達はしていた)
到達したメールのヘッダーには次の二種類のタグがつけられていた。
Received-SPF: none (google.com: 送信元メールアドレス does not designate permitted sender hosts) client-ip=PostfixのグローバルIPv4アドレス
Authentication-Results: mx.google.com;
       spf=none (google.com: 送信元メールアドレス does not designate permitted sender hosts) smtp.mail=送信元メールアドレス

これは、送信メール(のエンベロープ)に指定された送信元メールアドレスに含まれるドメイン  A.domain.tld に対して、
GmailがSPFレコードを検索しようとしたところ、該当するレコードが見つからなかったというエラーである。
上記エラーログには、次のように示されている。
送信元メールアドレス(のドメインA.domain.tld)は、送信用ホストを指定していないという旨である。
送信元メールアドレス does not designate permitted sender hosts

SPFレコードは、メールの送信元ドメインが使用する送信元IPアドレスを予め登録しておくために利用される。
これによって、メールに記載された送信元ドメインと、送信元IPアドレスの関連付けがなされる。
関連付けがSPFレコードによって見つけられなければ、SPAMメールとして判断される場合がある。

回避するには、A.domain.tldにSPFレコードを設定し、
最初に通過したSMTPサーバであるPostfixのグローバルIPv4アドレスを登録する必要があると思われる。



◆フォールバック用SMTPサーバーの登録もしておいたほうが良い。

smtp_fallback_relay = smtp.another-domain.tld:587

これついても同様に、対応するSMTP認証情報を登録しておくこと。

万が一、メインSMTPサーバーとの間に問題が発生しても、フォールバックSMTPサーバーを通じて配送が行われる。



<参考>
・SMTP fallback relay
< https://wiki.zimbra.com/wiki/Smtp_fallback_relay > 2016年2月15日

・Kurztipp: postfix – SASL authentication failure: No worthy mechs found
< http://www.stankowic-development.net/?p=5317 > 2015年5月5日

・SMTP-AUTHを使って上位メールサーバへ転送する
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix25.htm > 2015年5月5日

・上位メールサーバへ一律転送するメールサーバ
< http://hp.vector.co.jp/authors/VA022911/tec/centos/postfix2.htm > 2015年5月5日

・Outgoing SMTP Authentication
< https://wiki.zimbra.com/wiki/Outgoing_SMTP_Authentication > 2015年5月5日

・Postfix SASL Howto
< http://www.postfix.org/SASL_README.html#client_sasl_policy > 2015年5月5日

・Postfixで、GMAIL経由でメールを送る(OP25B対策)
< http://blog.f13.jp/post/25843286280/postfix-gmail-op25b > 2015年5月5日

・Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth)
< http://www.maruko2.com/mw/Postfix_%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%AA%E3%83%AC%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A_%28SMTP_%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88_%2B_SMTP_Auth%29 > 2015年5月5日

・SASL authentication failure: No worthy mechs foundAdd Star
< http://d.hatena.ne.jp/machua/20120301/1330625122 > 2015年5月5日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad