<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Cyberbe Notes       from Blackcat</title>
<subtitle></subtitle>
<link href="http://blog.cyberbe.ru/feed.php" rel="self" />
<id>http://blog.cyberbe.ru/feed.php</id>
<updated>2016-12-18T23:24:07+03:00</updated>
<entry>
<title type="html">Postfix check_recipient_access with MySQL</title>
<content type="html">&lt;p&gt;Для предотвращения повторной отправки писем &quot;несуществующим&quot; пользователям добавляем в правило postfix:&lt;/p&gt;
&lt;p&gt;smtpd_recipient_restrictions = &lt;strong&gt;mysql:/etc/postfix/mysql/mysql-virtual-recipient-access.cf,&lt;/strong&gt;&lt;br /&gt;                                             permit_mynetworks,&lt;br /&gt;                                             permit_sasl_authenticated,&lt;/p&gt;
&lt;p&gt;&lt;!-- pagebreak --&gt;&lt;/p&gt;
&lt;p&gt;Содержимое /etc/postfix/mysql/mysql-virtual-recipient-access.cf:&lt;/p&gt;
&lt;pre&gt;&lt;code data-language=&quot;generic&quot;&gt;user = &amp;lt;username&amp;gt;
password = &amp;lt;password&amp;gt;
hosts = &amp;lt;host&amp;gt;
dbname = &amp;lt;dbname&amp;gt;
query = select ifnull( (select (case `notificationType` when  &#039;bounced&#039; then &#039;REJECT&#039; END) as access  FROM `EmailStatuses` WHERE `recipients` = &#039;%s&#039; limit 1),&#039;OK&#039;) as access&lt;br /&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Запрос к базе формируется по вкусу, у меня статусы отправки пишутся в базу отдельным скриптом&lt;/p&gt;
&lt;p&gt;Не забыть перезапустить postfix&lt;/p&gt;
&lt;p&gt;Сделано на основе - https://kitt.hodsden.org/blog/2014/06/postfix_check_recipient_access_mysql&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content>
<link href="http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=41" />
<id>http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=41</id>
<updated>2016-12-18T23:24:07+03:00</updated>
<category term="Postfix"/>
</entry>
<entry>
<title type="html">Postfix disable Delivery Status notification</title>
<content type="html">&lt;p&gt;Для полной блокировки DSN добавьте в main,cf:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;smtpd_discard_ehlo_keywords = silent-discard, dsn&lt;/p&gt;</content>
<link href="http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=40" />
<id>http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=40</id>
<updated>2016-12-18T23:16:14+03:00</updated>
<category term="Linix"/>
</entry>
<entry>
<title type="html">Балансировка отправки почты с нескольких IP (Postfix)</title>
<content type="html">&lt;p&gt;Install the perl module List::util::WeightedRoundRobin:&lt;br /&gt;cpan install /List::util::WeightedRoundRobin/&lt;/p&gt;
&lt;p&gt;Create the following perl script and make it executable:&lt;br /&gt;vi /etc/postfix/random.pl&lt;/p&gt;
&lt;p&gt;&lt;!-- pagebreak --&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code data-language=&quot;generic&quot;&gt;#!/usr/bin/perl -w
# author: Hari Hendaryanto &amp;lt;hari.h -at- csmcom.com&amp;gt;
use strict;
use warnings;
use Sys::Syslog qw(:DEFAULT setlogsock);
use List::Util::WeightedRoundRobin;
use Storable;

my $hashfile=&quot;/tmp/file.hash&quot;;
store {}, $hashfile unless -r $hashfile;

#
# our transports lists, we will define this in master.cf as transport services
# Queued using Weighted Round-Robin Scheduling
#
my $list = [
{
name =&amp;gt; &#039;smtp1:&#039;,
weight =&amp;gt; 1,
},
{
name =&amp;gt; &#039;smtp2:&#039;,
weight =&amp;gt; 1,
},
{
name =&amp;gt; &#039;smtp3:&#039;,
weight =&amp;gt; 1,
},
{
name =&amp;gt; &#039;smtp4:&#039;,
weight =&amp;gt; 1,
},
{
name =&amp;gt; &#039;smtp5:&#039;,
weight =&amp;gt; 1,
},
{
name =&amp;gt; &#039;smtp6:&#039;,
weight =&amp;gt; 1,
},
{
name =&amp;gt; &#039;smtp7:&#039;,
weight =&amp;gt; 1,
},
];

my $WeightedList = List::Util::WeightedRoundRobin-&amp;gt;new();
my $weighted_list = $WeightedList-&amp;gt;create_weighted_list( $list );

# $maxinqueue max number of queue in smtp list
my $maxinqueue = scalar(@{$weighted_list});

#
# Initalize and open syslog.
#
openlog(&#039;postfix/randomizer&#039;,&#039;pid&#039;,&#039;mail&#039;);
#
# Autoflush standard output.
#
select STDOUT; $|++;

while (&amp;lt;&amp;gt;) {
chomp;
my $count;
my $hash=retrieve($hashfile);

if (!defined $hash-&amp;gt;{&quot;index&quot;})
{
$count = 0;
} else {
$count = $hash-&amp;gt;{&quot;index&quot;};
}

if ($count &amp;gt;= $maxinqueue)
{
$hash-&amp;gt;{&quot;index&quot;} = 0;
$count = 0;
}

$hash-&amp;gt;{&quot;index&quot;}++;
store $hash, $hashfile;
my $random_smtp = ${$weighted_list}[$count];
if (/^get\s(.+)$/i) {
print &quot;200 $random_smtp\n&quot;;
syslog(&quot;info&quot;,&quot;Using: %s Transport Service&quot;, $random_smtp);
next;
}
print &quot;200 smtp:\n&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Execute the script to make sure it`s working and no errors are encountered:&lt;br /&gt;/etc/postfix/random.pl&lt;/p&gt;
&lt;p&gt;Configure postfix to use the random generated smtp transport.&lt;/p&gt;
&lt;p&gt;Edit /etc/postfix/master.cf, by appending following lines:&lt;/p&gt;
&lt;pre&gt;&lt;code data-language=&quot;generic&quot;&gt;## Round-robin outgoing smtp
127.0.0.1:23000 inet n n n - 0 spawn
user=nobody argv=/etc/postfix/random.pl
# random smtp
smtp1 unix - - n - - smtp
-o syslog_name=postfix-smtp1
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp2 unix - - n - - smtp
-o syslog_name=postfix-smtp2
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP

smtp3 unix - - n - - smtp
-o syslog_name=postfix-smtp3
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp4 unix - - n - - smtp
-o syslog_name=postfix-smtp4
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp5 unix - - n - - smtp
-o syslog_name=postfix-smtp5
-o smtp_helo_name=FQDN
-o smtp_bind_address=IP

smtp6 unix - - n - - smtp
-o syslog_name=postfix-smtp6
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP

smtp7 unix - - n - - smtp
-o syslog_name=postfix-smtp7
-o smtp_helo_name= FQDN
-o smtp_bind_address=IP

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Replace FQDN with desired hostname and IP with the list of the IP addresses you`d like to use.&lt;/p&gt;
&lt;p&gt;Append the following lines to your /etc/postfix/main.cf:&lt;br /&gt;transport_maps = tcp:127.0.0.1:23000&lt;br /&gt;127.0.0.1:23000_time_limit = 3600s&lt;/p&gt;
&lt;p&gt;Restart/reload postfix and verify everything is working correctly:&lt;br /&gt;# postmap -q &quot;dummy&quot; tcp:127.0.0.1:23000&lt;br /&gt;smtp4:&lt;br /&gt;# postmap -q &quot;dummy&quot; tcp:127.0.0.1:23000&lt;br /&gt;smtp5:&lt;br /&gt;# postmap -q &quot;dummy&quot; tcp:127.0.0.1:23000&lt;br /&gt;smtp6:&lt;/p&gt;
&lt;p&gt;In your logs you should see the different smtp transport beeing used when mails are sent:&lt;br /&gt;Sep 2 12:50:05 myserver postfix-smtp2/smtp[2016]: 3CA964C0004: to=&amp;lt;example@domain.org&amp;gt;, relay=domain.org[XXXXXXXXX]:25, delay=2, delays=0.03/0.01/0.18/1.8, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005tU-E9)&lt;br /&gt;Sep 2 12:50:05 myserver postfix-smtp5/smtp[2014]: 4EE244C0012: to=&amp;lt;example@domain.org&amp;gt;, relay=domain.org[XXXXXXXXX]:25, delay=2, delays=0.01/0/0.21/1.8, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005tx-Gn)&lt;br /&gt;Sep 2 12:50:05 myserver postfix-smtp3/smtp[2045]: 69305680035: to=&amp;lt;example@domain.org&amp;gt;, relay=domain.org[XXXXXXXXX]:25, delay=2, delays=0.05/0/0.11/1.9, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005uJ-Ih)&lt;br /&gt;Sep 2 12:50:05 myserver postfix-smtp3/smtp[2034]: 444B94C0006: to=&amp;lt;example@domain.org&amp;gt;, relay=domain.org[XXXXXXXXX]:25, delay=2.2, delays=0.04/0/0.21/1.9, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005tW-G9)&lt;br /&gt;Sep 2 12:50:05 myserver postfix-smtp1/smtp[2039]: 585A6583CFE: to=&amp;lt;example@domain.org&amp;gt;, relay=domain.org[XXXXXXXXX]:25, delay=2.2, delays=0.01/0/0.15/2, dsn=2.0.0, status=sent (250 OK id=1T86oe-0005u0-GO)&lt;/p&gt;</content>
<link href="http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=39" />
<id>http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=39</id>
<updated>2016-12-09T11:17:34+03:00</updated>
<category term="Linix"/>
</entry>
<entry>
<title type="html">How to Create Scheduled Events in MySQL</title>
<content type="html">&lt;p&gt; &lt;/p&gt;
&lt;p&gt;you can start the scheduler from the MySQL command line:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;SET GLOBAL event_scheduler = ON;&lt;/p&gt;
&lt;p&gt;&lt;!-- pagebreak --&gt;&lt;/p&gt;
&lt;p&gt;Creating an Event&lt;/p&gt;
&lt;p&gt;We require a scheduled event which:&lt;/p&gt;
&lt;p&gt;Copies posts from `blog` to `blog_archive` when the deleted flag is set to 1.&lt;br /&gt; Copies the associated audit entries for those posts from `audit` to `audit_archive`.&lt;br /&gt; Physically deletes archived posts from the `blog` table. Referential integrity has been defined with a foreign key so all associated audit entries for those posts will also be removed.&lt;/p&gt;
&lt;p&gt;Assuming you have MySQL rights to create events, the basic syntax is:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;CREATE EVENT `event_name` &lt;br /&gt;ON SCHEDULE schedule&lt;br /&gt;[ON COMPLETION [NOT] PRESERVE] &lt;br /&gt;[ENABLE | DISABLE | DISABLE ON SLAVE]&lt;br /&gt;DO BEGIN&lt;br /&gt; -- event body&lt;br /&gt;END;&lt;/p&gt;
&lt;p&gt;The schedule can be assigned various settings, e.g.&lt;/p&gt;
&lt;p&gt;Run once on a specific date/time:&lt;br /&gt; AT ‘YYYY-MM-DD HH:MM.SS’&lt;br /&gt; e.g. AT ‘2011-06-01 02:00.00’&lt;br /&gt; Run once after a specific period has elapsed:&lt;br /&gt; AT CURRENT_TIMESTAMP + INTERVAL n [HOUR|MONTH|WEEK|DAY|MINUTE]&lt;br /&gt; e.g. AT CURRENT_TIMESTAMP + INTERVAL 1 DAY&lt;br /&gt; Run at specific intervals forever:&lt;br /&gt; EVERY n [HOUR|MONTH|WEEK|DAY|MINUTE]&lt;br /&gt; e.g. EVERY 1 DAY&lt;br /&gt; Run at specific intervals during a specific period:&lt;br /&gt; EVERY n [HOUR|MONTH|WEEK|DAY|MINUTE] STARTS date ENDS date&lt;br /&gt; e.g. EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK ENDS ‘2012-01-01 00:00.00’&lt;/p&gt;
&lt;p&gt;An event is normally dropped once its schedule has expired (ON COMPLETION NOT PRESERVE). Set ON COMPLETION PRESERVE to prevent that behavior. The MySQL CREATE EVENT Syntax documentation provides further details.&lt;/p&gt;
&lt;p&gt;We can now define our event (remembering to set the DELIMITER first). We’ll set it to run every week starting on a Sunday morning:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;DELIMITER $$&lt;/p&gt;
&lt;p&gt;CREATE &lt;br /&gt; EVENT `archive_blogs` &lt;br /&gt; ON SCHEDULE EVERY 1 WEEK STARTS &#039;2011-07-24 03:00:00&#039; &lt;br /&gt; DO BEGIN&lt;br /&gt; &lt;br /&gt; -- copy deleted posts&lt;br /&gt; INSERT INTO blog_archive (id, title, content) &lt;br /&gt; SELECT id, title, content&lt;br /&gt; FROM blog&lt;br /&gt; WHERE deleted = 1;&lt;br /&gt; &lt;br /&gt; -- copy associated audit records&lt;br /&gt; INSERT INTO audit_archive (id, blog_id, changetype, changetime) &lt;br /&gt; SELECT audit.id, audit.blog_id, audit.changetype, audit.changetime &lt;br /&gt; FROM audit&lt;br /&gt; JOIN blog ON audit.blog_id = blog.id&lt;br /&gt; WHERE blog.deleted = 1;&lt;br /&gt; &lt;br /&gt; -- remove deleted blogs and audit entries&lt;br /&gt; DELETE FROM blog WHERE deleted = 1;&lt;br /&gt; &lt;br /&gt; END */$$&lt;/p&gt;
&lt;p&gt;DELIMITER ;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;https://www.sitepoint.com/how-to-create-mysql-events/&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</content>
<link href="http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=38" />
<id>http://blog.cyberbe.ru/index.php?controller=post&amp;amp;action=view&amp;amp;id_post=38</id>
<updated>2016-10-06T18:55:58+03:00</updated>
<category term="MySQL"/>
</entry>
</feed>