<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aditya Chamim Pratama</title>
    <description>The latest articles on DEV Community by Aditya Chamim Pratama (@adityacprtm).</description>
    <link>https://dev.to/adityacprtm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F463875%2F0c8d3fc0-9a24-40a8-8e56-1616966a98e7.png</url>
      <title>DEV Community: Aditya Chamim Pratama</title>
      <link>https://dev.to/adityacprtm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adityacprtm"/>
    <language>en</language>
    <item>
      <title>Cara Membuat Laravel Tagging System</title>
      <dc:creator>Aditya Chamim Pratama</dc:creator>
      <pubDate>Sat, 13 Feb 2021 18:56:28 +0000</pubDate>
      <link>https://dev.to/adityacprtm/cara-membuat-laravel-tagging-system-ll6</link>
      <guid>https://dev.to/adityacprtm/cara-membuat-laravel-tagging-system-ll6</guid>
      <description>&lt;p&gt;Setelah sebelumnya membuat &lt;a href="https://dev.to/adityacprtm/cara-membuat-newsletter-subscribers-dengan-laravel-22ho"&gt;Subscription System&lt;/a&gt;, ini cara kami bagaimana membuat atau mengelola sistem tag yang mudah dan gratis dengan Laravel pada situs ini sebelum beralih ke wordpress. Sistem Tagging ini diperlukan ketika membuat sebuah situs yang berisi artikel atau blog. Jika menulis postingan untuk teknologi, maka dapat membuat tag seperti nama teknologi, jenis teknologi, fitur teknologi, dll.&lt;/p&gt;

&lt;p&gt;Dalam posting ini, akan menunjukkan cara membuat Laravel Tagging System menggunakan package dari &lt;a href="https://github.com/rtconner/laravel-tagging"&gt;rtconner/laravel-tagging&lt;/a&gt;. Di sini kami asumsikan telah memiliki proyek laravel dan kemudian menginstal paket laravel-tagging.&lt;/p&gt;

&lt;h1&gt;
  
  
  Install Package Laravel Tagging System
&lt;/h1&gt;

&lt;p&gt;Pada langkah ini, kita perlu menginstal package &lt;code&gt;rtconner/laravel-tagging&lt;/code&gt; menggunakan &lt;code&gt;composer&lt;/code&gt; dengan menjalankan perintah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require rtconner/laravel-tagging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Publish dan jalankan migrasi
&lt;/h1&gt;

&lt;p&gt;Package tersebut akan autodiscover saat mengupdate composer. Kemudian publikasikan &lt;code&gt;tagging.php&lt;/code&gt; dan jalankan migrasi database dengan perintah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan vendor:publish --provider="Conner\Tagging\Providers\TaggingServiceProvider"
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Setup Models
&lt;/h1&gt;

&lt;p&gt;Kemudian siapkan models yang akan digunakan, asumsikan models &lt;code&gt;Post.php&lt;/code&gt;, dengan menambahkan baris ini &lt;code&gt;use \Conner\Tagging\Taggable;&lt;/code&gt; kedalam class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    use \Conner\Tagging\Taggable;
    protected $fillable = ['title','tags','description'];
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Setup Controller
&lt;/h1&gt;

&lt;p&gt;Di controller yang akan digunakan, asumsikan &lt;code&gt;PostController.php&lt;/code&gt;, pada bagian store data tambahkan baris untuk memasukkan data tag ke database. Sesuaikan kode dibawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    public function store(Request $request)
    {
        $this-&amp;gt;validate($request, [
            'title' =&amp;gt; 'required',
            'description' =&amp;gt; 'required',
            'tags' =&amp;gt; 'required',
        ]);

        $input = $request-&amp;gt;all();
        $tags = explode(", ", $input['tags']); // pecahkan string ke array tags
        $post = Post::create($input); // data post ke db
        $post-&amp;gt;tag($tags); // data array tags ke db

        return back()-&amp;gt;with('success','Post created successfully.');
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Setup View
&lt;/h1&gt;

&lt;p&gt;Untuk layout dapat disesuaikan, atau bisa menggunakan Bootstrap, JQuery dan &lt;a href="https://bootstrap-tagsinput.github.io/bootstrap-tagsinput/examples/"&gt;Bootstrap Tags Input&lt;/a&gt;. Untuk menggunakan Bootstrap Tags Input cukup tambahkan &lt;code&gt;data-role="tagsinput"&lt;/code&gt; ke input field yang akan secara otomatis mengubahnya menjadi tag input field. Sesuaikan contoh dibawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;form method="POST" action="{{ route('posts.store') }}"&amp;gt;
    ...
    &amp;lt;div class="form-group"&amp;gt;
        &amp;lt;label&amp;gt;Tags : &amp;lt;span class="text-danger"&amp;gt;*&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;
        &amp;lt;br&amp;gt;
        &amp;lt;input type="text" data-role="tagsinput" name="tags" class="form-control tags"&amp;gt;
        &amp;lt;br&amp;gt;
        @if ($errors-&amp;gt;has('tags'))
            &amp;lt;span class="text-danger"&amp;gt;{{ $errors-&amp;gt;first('tags') }}&amp;lt;/span&amp;gt;
        @endif
    &amp;lt;/div&amp;gt;
    ...
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk menampilkan tag yang sudah dimasukkan bersamaan dengan postingan dapat jalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@foreach($posts as $post)
    ...
    &amp;lt;div class="post-tags mb-4"&amp;gt;
        &amp;lt;strong&amp;gt;Tags : &amp;lt;/strong&amp;gt;
        @foreach($post-&amp;gt;tags as $tag)
            &amp;lt;span class="badge badge-info"&amp;gt;{{$tag-&amp;gt;name}}&amp;lt;/span&amp;gt;
        @endforeach
    &amp;lt;/div&amp;gt;
    ...
@endforeach
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;That’s it! Sistem tag menggunakan laravel sudah siap digunakan. Untuk informasi lebih lanjut atau contoh penggunaan lain tentang package ini dapat dilihat di halaman github &lt;a href="https://github.com/rtconner/laravel-tagging"&gt;rtconner/laravel-tagging&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>tag</category>
    </item>
    <item>
      <title>Cara Membuat Newsletter Subscribers dengan Laravel</title>
      <dc:creator>Aditya Chamim Pratama</dc:creator>
      <pubDate>Sat, 30 Jan 2021 10:57:04 +0000</pubDate>
      <link>https://dev.to/adityacprtm/cara-membuat-newsletter-subscribers-dengan-laravel-22ho</link>
      <guid>https://dev.to/adityacprtm/cara-membuat-newsletter-subscribers-dengan-laravel-22ho</guid>
      <description>&lt;p&gt;Ini cara aku bagaimana membuat atau mengelola Newsletter Subscribers internal yang mudah dan gratis dengan Laravel untuk mengirimkan notifikasi berupa email ke daftar subscriber mengenai konten baru pada situs blog.adityacprtm.com sebelum beralih ke wordpress.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;update: beralih ke &lt;a href="https://dev.to/adityacprtm"&gt;dev.to/adityacprtm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Solusi lainnya dapat menggunakan jasa penyedia Newsletter Subscription seperti MailChimp. Namun jika tidak ingin menggunakan pihak ketiga untuk menyimpan data Subscriber, kita dapat membuatnya sendiri dengan laravel menggunakan package dari &lt;a href="https://github.com/mydnic/laravel-subscribers"&gt;mydnic/laravel-subscribers&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Instalasi
&lt;/h1&gt;

&lt;p&gt;Diasumsikan telah memiliki proyek laravel yang sudah siap.&lt;/p&gt;

&lt;p&gt;Kita dapat menggunakan Composer untuk menginstal, package akan otomatis terpasang&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;composer require mydnic/laravel-subscribers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian lakukan publish migrasi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php artisan vendor:publish --provider="Mydnic\Subscribers\SubscribersServiceProvider" --tag="subscribers-migrations"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Cara Penggunaan Newsletter Subscribers
&lt;/h1&gt;

&lt;p&gt;Kita hanya perlu membuat sebuah form, kemudian sesuaikan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;form action="{{ route('subscribers.store') }}" method="post"&amp;gt;
    @csrf
    &amp;lt;input type="email" name="email"&amp;gt;
    &amp;lt;input type="submit" value="submit"&amp;gt;
&amp;lt;/form&amp;gt;
@if (session('subscribed'))
    &amp;lt;div class="alert alert-success"&amp;gt;
        {{ session('subscribed') }}
    &amp;lt;/div&amp;gt;
@endif
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Unsubscribe atau Hapus
&lt;/h1&gt;

&lt;p&gt;Cukup berikan tautan ini ke subscriber:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;a href="{{ route('subscribers.delete', ['email' =&amp;gt; $subscriber-&amp;gt;email]) }}"&amp;gt;unsubscribe&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Baris tersebut akan menghasilkan tautan seperti: &lt;code&gt;/subscribers/delete?email=email@example.com&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;That’s it! Selanjutnya siapkan template untuk email.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>subscription</category>
    </item>
    <item>
      <title>Cara Mudah Mengatur Access Control List (ACL) di Linux</title>
      <dc:creator>Aditya Chamim Pratama</dc:creator>
      <pubDate>Sat, 23 Jan 2021 03:17:57 +0000</pubDate>
      <link>https://dev.to/adityacprtm/cara-mudah-mengatur-access-control-list-acl-di-linux-5af2</link>
      <guid>https://dev.to/adityacprtm/cara-mudah-mengatur-access-control-list-acl-di-linux-5af2</guid>
      <description>&lt;p&gt;Ada banyak tantangan dalam mengelola Linux di lingkungan bisnis modern, diantaranya bahwa kita harus bisa mengelola siapa yang memiliki akses ke suatu informasi atau biasa yang disebut Access Control List. Untuk melakukan hal itu, dapat menggunakan &lt;em&gt;basic linux filesystem permissions&lt;/em&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Review Basic Linux Permissions
&lt;/h1&gt;

&lt;p&gt;Ada 3 jenis permissions di Linux filesystem, berikut penjelasan sederhananya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;U&lt;/strong&gt;ser atau user owner&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;G&lt;/strong&gt;roup atau owner group&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O&lt;/strong&gt;ther atau orang lain selain diatas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dari ketiga jenis permissions diatas, masing-masing dapat diberikan 3 jenis akses yaitu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R&lt;/strong&gt;ead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;W&lt;/strong&gt;rite&lt;/li&gt;
&lt;li&gt;e &lt;strong&gt;X&lt;/strong&gt; ecute&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sebagai contoh terdapat direktori berisi file dari departemen development dengan permissions sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;drwxrwxr-x  2 development development 6 Jan  8 15:13
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dari contoh diatas, user development (user pemilik) dapat membaca dan menulis ke direktori. Anggota dari group development (atau owner group) juga dapat membaca dan menulis direktori, sedangkan orang lain atau other tidak bisa menulis. Sebagai catatan, contoh diatas mengizinkan other dapat membaca atau melihat isi direktori.&lt;/p&gt;

&lt;h1&gt;
  
  
  Linux Access Control List (ACL)
&lt;/h1&gt;

&lt;p&gt;Pada situasi tertentu, basic permissions dapat menjadi rumit karena tiap file dan direktori hanya dapat memiliki satu user dan satu group owner pada satu waktu. Jenis situasi ini dapat diatasi oleh Linux Access Control List (ACLs).&lt;/p&gt;

&lt;p&gt;ACL memungkinkan untuk menerapkan sekumpulan izin yang lebih spesifik ke file atau direktori tanpa mengubah ownership dan permissions.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mengatur ACL
&lt;/h1&gt;

&lt;p&gt;Bagian ini membahas penggunaan Access Control List atau ACL di Linux. Hal ini memungkinkan waktu yang lebih mudah untuk menyiapkan izin untuk tugas-tugas otomatis seperti menerapkan aplikasi web.&lt;/p&gt;

&lt;p&gt;Pastikan ACL telah terinstal, jika belum jalankan perintah &lt;code&gt;sudo apt install acl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dalam kasus ini akan menunjukkan pengaturan ACL pada direktori. permissions ACL ini dapat diwarisi oleh direktori induk (parent directories). Mengatur ACL default untuk suatu lokasi sangat efektif, karena mengabaikan kebutuhan untuk selalu mengatur ulang permissions user/group setelah operasi file apa pun (misalnya membuat file baru).&lt;/p&gt;

&lt;h2&gt;
  
  
  Melihat ACL
&lt;/h2&gt;

&lt;p&gt;Untuk dapat melihat ACL saat ini di direktori tertentu dapat menggunakan perintah &lt;code&gt;getfacl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# getfacl /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Memasang ACL
&lt;/h2&gt;

&lt;p&gt;Syntax untuk menyetel ACL terlihat seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;setfacl [option] [action/specification] file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mengatur ACL untuk user dan direktori tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -R -m u:johndoe:rwx /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keterangan syntax diatas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;setfacl&lt;/code&gt; : Set ACL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-R&lt;/code&gt; : Rekursif ke dalam file dan direktori&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-m&lt;/code&gt; : Modifying ACL’s (-x untuk removing)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;u:johndoe:rwx&lt;/code&gt; : User johndoe akan mendapatkan permissions &lt;code&gt;rwx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/var/www&lt;/code&gt; : Memberikan permissions ke direktori &lt;code&gt;/var/www&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mengatur ACL untuk group pada direktori tertentu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -R -m g:www-data:rwx /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keterangan syntax diatas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;g:www-data:rwx&lt;/code&gt; : Anggota group &lt;code&gt;www-data&lt;/code&gt; mendapatkan permissions &lt;code&gt;rwx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Mengahapus ACL
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -x g:www-data /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keterangan syntax diatas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-x&lt;/code&gt; : Hapus ACL’s untuk &lt;code&gt;g:www-data&lt;/code&gt; di &lt;code&gt;/var/www&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Contoh Kasus
&lt;/h1&gt;

&lt;p&gt;Untuk lebih memahami, dibawah ini merupakan contoh kasus dalam menerapkan aplikasi web. Terdapat 2 user dengan beda permissions. Baca juga bagaimana konfigurasi awal server untuk deploy aplikasi web &lt;a href="https://dev.to/adityacprtm/konfigurasi-awal-untuk-mengamankan-server-baru-24mk"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Buat User
&lt;/h2&gt;

&lt;p&gt;Buat user pertama dengan nama jane dan tambahkan ke group sudo agar dapat melakukan perintah &lt;code&gt;sudo&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# adduser jane
# usermod -a -G sudo jane
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User kedua beri nama &lt;code&gt;bob&lt;/code&gt;, &lt;code&gt;bob&lt;/code&gt; merupakan user yang dapat melakukan deploy website dan merupakan anggota dari group &lt;code&gt;www-data&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# adduser bob
# usermod -a -G www-data bob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Untuk memastikan file di root web merupakan grup dari &lt;code&gt;www-data&lt;/code&gt;, jalankan perintah dibawah. Ini tidak diperlukan untuk ACL permissions, namun tetap dilakukan untuk menjaga konsistensi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# chown -R www-data:www-data /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Penggunaan ACL
&lt;/h2&gt;

&lt;p&gt;User akan diberikan permission untuk &lt;code&gt;read/write/execute&lt;/code&gt; file dan direktori menggunakan ACL sebagai pengganti dari basic Linux permissions.&lt;/p&gt;

&lt;p&gt;Lihat set ACL secara default, ini terpisah dari basic permission user/group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# getfacl /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya berikan permission user jane untuk mengubah file web di direktori &lt;code&gt;/var/www&lt;/code&gt;. Secara teknis jane tidak membutuhkan ini, karena dia bisa menggunakan perintah &lt;code&gt;sudo&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -R -m u:jane:rwx /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Di atas menetapkan ACL untuk file atau direktori yang ada, di sini akan secara rekursif (-R) menetapkan default (-d flag) untuk file atau direktori mendatang.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -Rd -m u:jane:rwx /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cek perintah diatas telah berhasil ditambahkan&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# getfacl /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Dua perintah sebelumnya dapat digabungkan untuk mengatur default dan izin: &lt;code&gt;setfacl -R -m u:jane:rwx,d:u:jane:rwx /var/www&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Selanjutnya memberikan permission berbasis grup melalui ACL ke file web. Cara ini lebih efisien untuk user memungkinkan mengedit file web, terlepas dari siapa pemilik file tersebut selama menjadi anggota group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -R -m g:www-data:rwx /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atau menggunakan default (-d) untuk kedepannya&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# setfacl -Rd -m g:www-data:rwx /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika sudah, sekarang TIAP USER yang menjadi anggota dari grup &lt;code&gt;www-data&lt;/code&gt; dapat mengedit file di direktori &lt;code&gt;/var/www&lt;/code&gt;. Untuk memastikan cek ACL dengan menjalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# getfacl /var/www
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it! Kita bisa juga membaca artikel dari website Redhat mengenai ACL &lt;a href="https://www.redhat.com/sysadmin/linux-access-control-lists"&gt;disini&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Credits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;icon: designed by &lt;a href="https://smashicons.com/"&gt;Smashicons&lt;/a&gt; from Flaticon&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>acl</category>
    </item>
    <item>
      <title>Membuat OpenVPN Server dalam Hitungan Detik</title>
      <dc:creator>Aditya Chamim Pratama</dc:creator>
      <pubDate>Mon, 18 Jan 2021 15:29:08 +0000</pubDate>
      <link>https://dev.to/adityacprtm/membuat-openvpn-server-dalam-hitungan-detik-2c7h</link>
      <guid>https://dev.to/adityacprtm/membuat-openvpn-server-dalam-hitungan-detik-2c7h</guid>
      <description>&lt;p&gt;Saat ini membuat VPN server sendiri tidak sesulit yang dibayangkan. Tersedia beberapa repositori Github yang akan mengurangi kesulitan dalam menyiapkan VPN khususnya OpenVPN server. Sebelum mulai membangun VPN server, sedikit bahasan tentang apa itu VPN dan bagaimana cara kerja dari VPN.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu VPN?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Virtual_private_network"&gt;VPN&lt;/a&gt; atau Virtual Private Network adalah layanan koneksi secara aman (secure) dan pribadi (private) dengan mengenkripsi seluruh lalu lintas jaringan dan mengubah jalur koneksi melalui server VPN dan menyembunyikan pertukaran data yang terjadi.&lt;/p&gt;

&lt;p&gt;Sebagai contoh, klien VPN tidak pernah mengakses server (web) lain secara langsung, semuanya akan diminta dari server VPN dan server VPN akan meneruskan permintaan tersebut.&lt;/p&gt;

&lt;p&gt;Terdapat artikel yang bisa menjelaskan secara lengkap apa itu vpn dan fungsinya serta hal-hal lainnya mengenai VPN dengan kalimat yang mudah dipahami, kalian bisa membaca artikel tersebut &lt;a href="https://www.niagahoster.co.id/blog/apa-itu-vpn"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mengapa perlu server VPN sendiri?
&lt;/h2&gt;

&lt;p&gt;Memiliki VPN sendiri berarti memiliki kendali penuh dan hanya kita yang dapat membaca log server. Tanpa disadari ISP (Internet Service Provider) yang kita gunakan bisa memata-matai lalu lintas kita, sehingga perlu jalur khusus agar lalu lintas kita tidak terlihat.&lt;/p&gt;

&lt;p&gt;Ada banyak layanan VPN dari yang gratis hingga berbayar. Kita bisa menggunakannya, namun tidak menutup kemungkinan data atau trafik kita yang ada pada layanan VPN tersebut bocor. Bisa lihat selengkapnya &lt;a href="https://youtu.be/gxpX_mubz2A"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Berikut beberapa kasus penggunaan, di mana VPN dapat membantu:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menyembunyikan alamat IP asli&lt;/li&gt;
&lt;li&gt;Berselancar aman di Wi-Fi publik&lt;/li&gt;
&lt;li&gt;Mengakses layanan di dalam jaringan server VPN&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hosting server VPN
&lt;/h2&gt;

&lt;p&gt;Saya menggunakan server Ubuntu 20.04 LTS yang dihosting di AWS EC2. Sebelum menggunakan server baru sebagai VPN Server, saya melakukan konfigurasi awal dalam mengamankan server, langkah-langkahnya bisa dibaca &lt;a href="https://dev.to/adityacprtm/cara-membangun-serverless-website-dengan-recaptcha-di-aws-339k"&gt;disini&lt;/a&gt;. Khusus dalam kasus ini, tidak melakukan konfigurasi firewall dalam server melainkan menggunakan Security Group yang disediakan AWS.&lt;/p&gt;

&lt;p&gt;Untuk firewall, pastikan UDP port &lt;code&gt;1194&lt;/code&gt; terbuka karena port tersebut akan digunakan oleh OpenVPN. Atau bisa gunakan port lain dan sesuaikan dengan port ketika tahap instalasi nanti.&lt;/p&gt;

&lt;p&gt;Tutorial ini juga bisa digunakan di Debian, Ubuntu dan CentOS.&lt;/p&gt;

&lt;p&gt;Untuk menginstal server VPN dalam hitungan detik, saya menggunakan script shell yang dibuat oleh &lt;a href="https://github.com/Nyr"&gt;Nyr&lt;/a&gt; bernama &lt;a href="https://github.com/Nyr/openvpn-install"&gt;openvpn-install&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi OpenVPN Server
&lt;/h2&gt;

&lt;p&gt;Download script shell.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://git.io/vpn -O openvpn-install.sh &amp;amp;&amp;amp; bash openvpn-install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah downlaod selesai, perlu membuat &lt;code&gt;openvpn-install.sh&lt;/code&gt; dapat dieksekusi.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chmod +x openvpn-install.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Script tersebut akan menanyakan beberapa pertanyaan tentang bagaimana kita ingin mengatur server VPN. Tekan Enter untuk menggunakan opsi default (direkomendasikan).&lt;/p&gt;

&lt;p&gt;Dalam percobaan ini, saya hanya mengubah DNS default menggunakan &lt;code&gt;1.1.1.1&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Welcome to this OpenVPN road warrior installer!

I need to ask you a few questions before starting setup.
You can use the default options and just press enter if you are ok with them.

Which protocol do you want for OpenVPN connections?
   1) UDP (recommended)
   2) TCP
Protocol [1]:

What port do you want OpenVPN listening to?
Port [1194]:

Which DNS do you want to use with the VPN?
   1) Current system resolvers
   2) 1.1.1.1
   3) Google
   4) OpenDNS
   5) Verisign
DNS [1]: 2

Finally, tell me a name for the client certificate.
Client name [client]:

Okay, that was all I needed. We are ready to set up your OpenVPN server now.
Press any key to continue...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya script akan menginstal OpenVPN di server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mengambil file .ovpn dari server
&lt;/h3&gt;

&lt;p&gt;Untuk dapat terhubung dengan VPN server, diperlukan file &lt;code&gt;.ovpn&lt;/code&gt; yang dihasilkan. Pada Windows, direkomendasikan menggunakan &lt;a href="https://filezilla-project.org/"&gt;Filezilla&lt;/a&gt; atau &lt;a href="https://winscp.net/eng/download.php"&gt;WinSCP&lt;/a&gt; dan masuk ke server menggunakan SFTP. Di macOS dan Linux, dapat menyalin file dari server ke mesin menggunakan &lt;code&gt;scp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Untuk menyalin file dengan &lt;code&gt;scp&lt;/code&gt; jalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scp &amp;lt;USERNAME&amp;gt;@&amp;lt;SERVER_IP&amp;gt;:/root/&amp;lt;CLIENT&amp;gt;.ovpn .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika sertifikat atau file &lt;code&gt;.ovpn&lt;/code&gt; digunakan untuk smartphone, gunakanlah media pengiriman yang aman. Untuk Mac atau iPhone, disarankan untuk menyalin file menggunakan AirDrop.&lt;/p&gt;

&lt;p&gt;Jika harus menggunakan Email, silakan zip file &lt;code&gt;.ovpn&lt;/code&gt; dan berikan password yang kuat untuk file zip sebelum mengirimkannya.&lt;/p&gt;

&lt;h3&gt;
  
  
  Menggunakan file .ovpn
&lt;/h3&gt;

&lt;p&gt;Untuk OS Windows bias downlaod apliaksi resmi dari &lt;a href="https://openvpn.net/community-downloads/"&gt;OpenVPN&lt;/a&gt;, di iOS dan Android ada aplikasi resmi OpenVPN Connect di &lt;a href="https://apps.apple.com/app/openvpn-connect/id590379981"&gt;App Store&lt;/a&gt; dan &lt;a href="https://play.google.com/store/apps/details?id=net.openvpn.openvpn"&gt;Google Play&lt;/a&gt;, sedangkan untuk macOS bisa menggunakan aplikasi &lt;a href="https://tunnelblick.net/"&gt;Tunnelblick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cara penggunaannya biasanya sama untuk tiap OS. Pertama harus mengimpor file &lt;code&gt;.ovpn&lt;/code&gt; dan kemudian melakukan koneksi ke server. Jika koneksi berhasil, cek alamat IP saat ini dengan mengetik kata &lt;a href="https://www.google.com/search?q=what+is+my+ip+address"&gt;what is my ip address&lt;/a&gt; di google dan Google akan menunjukkan alamat IP.&lt;/p&gt;

&lt;p&gt;Jika alamat IP sama dengan server, artinya klien dan server VPN berhasil terhubung.&lt;/p&gt;

&lt;h3&gt;
  
  
  Menambahkan user klien baru
&lt;/h3&gt;

&lt;p&gt;Untuk menambahkan pengguna baru cukup jalankan script tersebut dan pilih 1 kemudian nama untuk perangkat yang akan menggunakan sertifikat klien. Dalam kasus ini, saya membuat pengguna untuk iPhone saya.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./openvpn-install.sh

Looks like OpenVPN is already installed.

What do you want to do?
   1) Add a new user
   2) Revoke an existing user
   3) Remove OpenVPN
   4) Exit
Select an option: 1

Tell me a name for the client certificate.
Client name: iphone

Using SSL: openssl OpenSSL 1.1.1 11

...............

Write out database with 1 new entries
Data Base Updated

Client iphone added, configuration is available at: /root/iphone.ovpn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it! Kita sudah membuat privasi kita terlindungi selama di dunia maya dan kita bisa memberi selamat kepada diri sendiri karena baru saja menyiapkan server VPN yang dihosting sendiri 🎉.&lt;/p&gt;




&lt;p&gt;Credits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;icon: designed by &lt;a href="https://www.flaticon.com/authors/monkik"&gt;monkik&lt;/a&gt; from Flaticon&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openvpn</category>
      <category>vpn</category>
    </item>
    <item>
      <title>Konfigurasi Awal Untuk Mengamankan Server Baru</title>
      <dc:creator>Aditya Chamim Pratama</dc:creator>
      <pubDate>Sun, 17 Jan 2021 04:58:57 +0000</pubDate>
      <link>https://dev.to/adityacprtm/konfigurasi-awal-untuk-mengamankan-server-baru-24mk</link>
      <guid>https://dev.to/adityacprtm/konfigurasi-awal-untuk-mengamankan-server-baru-24mk</guid>
      <description>&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Server_(computing)"&gt;Server&lt;/a&gt; atau dalam bahasa Indonesia disebut &lt;a href="https://id.wikipedia.org/wiki/Peladen"&gt;Peladen&lt;/a&gt; merupakan perangkat atau program komputer yang menyediakan layanan untuk program atau perangkat lain yang biasa disebut klien. Server dapat dibedakan berdasarkan jenisnya sebagai database server, file server, mail server, web server dan lain-lain.&lt;/p&gt;

&lt;p&gt;Satu server dapat melayani banyak klien, sehingga mengamankan server menjadi hal penting untuk menjaga layanan server tetap berjalan. Di artikel ini menjelaskan langkah awal yang harus dilakukan untuk mengamankan server, termasuk pengaturan user, konfigurasi ssh dan firewall.&lt;/p&gt;

&lt;p&gt;Dalam kasus ini, menggunakan Amazon Web Service (AWS) sebagai server. Kamu bisa menggunakan penyedia VPS atau cloud computing lainnya seperti Microsoft Azure, Google Cloud (GCP), Digitalocean dan lain-lain. Login ke server menggunakan connection method sesuai layanan yang digunakan, biasanya sebagai root.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konfigurasi keamanan User
&lt;/h2&gt;

&lt;p&gt;Saat sudah login sebagai root di server, mulai dengan membuat user baru dan autorisasi akses berbasis SSH untuk SSH Key pair.&lt;/p&gt;

&lt;p&gt;Buat user baru dan masukkan password, info lainnya bersifat optional&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# adduser aditya
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Login sebagai user yang telah dibuat&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# su aditya
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buat direktori &lt;code&gt;.ssh&lt;/code&gt; didalam direktori user jika belum ada&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir /home/aditya/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buat file authorized_keys didalam direktori &lt;code&gt;.ssh&lt;/code&gt; dan biarkan tab terminal terbuka.&lt;br&gt;
Pastikan permission direktori ssh 700 dan file authorized_keys 600.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ vim .ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buka tab terminal baru di local, buat &lt;code&gt;key&lt;/code&gt; dengan nama key sesuai keinginan difolder &lt;code&gt;.ssh&lt;/code&gt;&lt;br&gt;
Sedikit tambahan, upgrade algoritma untuk SSH Key menggunakan ED25519. Algoritma yang biasanya digunakan seperti DSA atau RSA saat ini telah deprecated. Kamu bisa baca info lanjut &lt;a href="https://blog.g3rt.nl/upgrade-your-ssh-keys.html"&gt;disini&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ssh-keygen -o -a 100 -t ed25519 -f id_key_myserver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy isi dari public key &lt;code&gt;id_key_myserver.pub&lt;/code&gt; dan paste-kan ke file &lt;code&gt;authorized_keys&lt;/code&gt; diserver pada tab terminal&lt;/p&gt;

&lt;p&gt;Jika sesuai, exit SSH server kemudian login sebagai user baru menggunakan private key &lt;code&gt;id_key_myserver&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ssh -i &amp;lt;PATH id_rsa file&amp;gt; &amp;lt;USERNAME&amp;gt;@&amp;lt;IP SERVER&amp;gt;
$ ssh -i ~/.ssh/id_key_myserver aditya@10.10.10.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Konfigurasi Keamanan SSH
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Konfigurasi SSH
&lt;/h3&gt;

&lt;p&gt;Kita akan konfigurasi SSH agar sedikit lebih aman dengan menerapkan penggunaan akses berbasis kunci SSH dan memastikan bahwa pengguna root tidak dapat masuk melalui SSH secara langsung.&lt;/p&gt;

&lt;p&gt;Buka file &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; dengan editor&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ vim /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cari dan ubah beberapa field seperti berikut&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Penting
PermitRootLogin no
PasswordAuthentication no

# Cek Ulang bagian ini
PubkeyAuthentication yes
PermitEmptyPasswords no

# Optional
AllowUsers aditya #hanya user tertentu yang diizinkan
AllowGroups sudo ssh #hanya group sudo dan ssh yang diizinkan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian restart ssh service&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo service ssh restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Konfigurasi Fail2ban
&lt;/h3&gt;

&lt;p&gt;Kita juga akan menggunakan &lt;code&gt;fail2ban&lt;/code&gt;, yang akan memeriksa file &lt;code&gt;/var/log/auth.log&lt;/code&gt; untuk kegagalan login SSH berulang kali dan melarang login dari sumber (IP) login tersebut, ini akan memberi perlindungan ekstra terhadap akses SSH berbasis brute-force.&lt;/p&gt;

&lt;p&gt;Install fail2ban&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt-get install -y fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pastikan konfigurasi pada file &lt;code&gt;/etc/fail2ban/jail.d&lt;/code&gt; ada konfigurasi sshd seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[sshd]
enabled = true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika sudah, maka fail2ban akan melakukan tugasnya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Konfigurasi Keamanan Firewalls (Optional)
&lt;/h2&gt;

&lt;p&gt;Bagian ini bersifat optional, karena biasanya penyedia layanan cloud sudah menerapkan sistem keamanan seperti firewalls. Contohnya pada AWS terdapat Security Group yang bertindak sebagai firewall virtual untuk mengontrol lalu lintas masuk dan keluar.&lt;/p&gt;

&lt;p&gt;Untuk melihat aturan firewall, dapat menjalankan perintah &lt;code&gt;sudo iptables -L -v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kita akan menambahkan ke input chain, yang mengontrol traffic incoming (ingress):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -j DROP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita telah menambahkan beberapa aturan diatas, diantaranya port 22 untuk SSH dan port 80 untuk HTTP. Selain itu bisa juga memasukkan aturan ke lokasi tertentu seperti port untuk HTTPS ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo iptables -I INPUT 5 -p tcp --dport 443 -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terakhir, kita perlu membuat aturan ini running saat reboot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Instal ini akan menyimpan aturan saat ini
sudo apt-get install -y netfilters-persistent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it! Kita sudah melakukan langkah awal dalam mengamankan server baru kita.&lt;/p&gt;




&lt;p&gt;Credit&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;icon: designed by Pixelmeetup from Flaticon&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>server</category>
      <category>configure</category>
    </item>
    <item>
      <title>Cara Membangun Serverless Website dengan reCAPTCHA di AWS</title>
      <dc:creator>Aditya Chamim Pratama</dc:creator>
      <pubDate>Wed, 13 Jan 2021 15:13:01 +0000</pubDate>
      <link>https://dev.to/adityacprtm/cara-membangun-serverless-website-dengan-recaptcha-di-aws-339k</link>
      <guid>https://dev.to/adityacprtm/cara-membangun-serverless-website-dengan-recaptcha-di-aws-339k</guid>
      <description>&lt;p&gt;Ini berdasarkan pengalaman saya menghosting static website pribadi saya (&lt;a href="https://adityacprtm.com/"&gt;adityacprtm.com&lt;/a&gt;) di AWS. Saya tidak ingin menjalankan server hanya untuk menangani formulir ‘Contact Us’. Oh, dan saya juga butuh Captcha karena tidak ingin banyaknya spam yang masuk. Jadi saya menggunakan arsitektur serverless website dan google recaptcha untuk itu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: Artikel ini merupakan re-upload dan terjemahan bahasa, artikel original saya bisa dilihat dilink &lt;a href="https://link.medium.com/YxF2ZlXBN1"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RP-7E9tL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2v5u6eoqaog0zdqref1s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RP-7E9tL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/2v5u6eoqaog0zdqref1s.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Arsitektur Aplikasi
&lt;/h2&gt;

&lt;p&gt;Arsitektur aplikasi yang digunakan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;li&gt;Amazon API Gateway&lt;/li&gt;
&lt;li&gt;Amazon S3&lt;/li&gt;
&lt;li&gt;Amazon SNS&lt;/li&gt;
&lt;li&gt;Amazon CloudFront&lt;/li&gt;
&lt;li&gt;Amazon Route 53&lt;/li&gt;
&lt;li&gt;AWS Certificate Manager&lt;/li&gt;
&lt;li&gt;Google reCaptcha&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Buat Bucket di Amazon S3
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka Amazon S3 console atau akses &lt;a href="https://console.aws.amazon.com/s3/"&gt;disini&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;buat bucket dengan nama domain kamu, contohnya example.com&lt;/li&gt;
&lt;li&gt;Cukup sampai sini, kita akan upload file nanti&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Buat SNS Topic dan Subscription
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka SNS Console atau akses &lt;a href="https://console.aws.amazon.com/sns/"&gt;disini&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Buat Topic name&lt;/li&gt;
&lt;li&gt;Buat Subscription, pilih Topic ARN sesuai yang telah dibuat pada point 2&lt;/li&gt;
&lt;li&gt;Pilih email pada protocol type, lalu create subscription&lt;/li&gt;
&lt;li&gt;Periksa email yang didaftarkan dan verify subscription dari AWS&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Membuat Serverless Back-end di AWS Lambda
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Di &lt;a href="https://console.aws.amazon.com/lambda/"&gt;Lambda Console&lt;/a&gt;, pilih create function&lt;/li&gt;
&lt;li&gt;Pilih Author from scratch&lt;/li&gt;
&lt;li&gt;Masukan Function name dan pilih Node.js untuk Runtime&lt;/li&gt;
&lt;li&gt;Kemudian pilih Create function&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sampai disini kita akan menggunakan lambda dengan JavaScript. Sayangnya kita tidak dapat dengan mudah memasukkan script ke editor online AWS Lambda yang memiliki dependensi eksternal seperti Axios. Jadi kita perlu membuat proyek Node dengan &lt;code&gt;package.json&lt;/code&gt; seperti berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
   "name":"contactForm",
   "version":"0.0.1",
   "private":true,
   "scripts":{},
   "dependencies":{
      "aws-sdk":"^2.560.0",
      "axios":"^0.18.0"
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kita akan menggunakan Environment variable di lambda untuk mempermudah ketika ada perubahan pada Topik SNS ARN dan ecret Key dari reCaptcha, ubah &lt;code&gt;index.js&lt;/code&gt; seperti berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;'use strict';
const AWS = require("aws-sdk");
const axios = require('axios');
const completeUrl = "https://www.google.com";
// verify recaptcha url
const reCapUrl = "https://www.google.com/recaptcha/api/siteverify";
const reCaptchaSecret = process.env.RECAPTCHA_SECRET_KEY;
// from Amazon SNS
const snsTopic = process.env.ARN_SNS_TOPIC;
module.exports.handler = async (event, context, callback) =&amp;gt; {
    console.log("Starting ContactForm Processing for website form.");
    // console.log("data event: " + JSON.stringify(event));
    // verify the result by POSTing to google backend with secret and frontend recaptcha token as payload
    let verifyResult = await axios({
        method: 'post',
        url: reCapUrl,
        params: {
            secret: reCaptchaSecret,
            response: event.captcha
        }
    }) // print out the result of that. Its a bit verbose though
    // console.log("verify result: " + JSON.stringify(verifyResult.data));
    if (verifyResult.data.success) {
        let sns = new AWS.SNS();
        // The structure of the email
        let emailbody = "Someone left a message for you.\n\nName\t\t: " + event.name + "\nEmail\t\t: " + event.email + "\nSubject\t\t: " + event.subject + "\nMessage\t\t: " + event.message + "\n\nThanks!";
        let params = {
            Message: emailbody,
            Subject: "Contact Form: " + event.subject,
            TopicArn: snsTopic
        };
        // we publish the created message to Amazon SNS now…
        sns.publish(params, context.done);
        // now we return a HTTP 302 together with a URL to redirect the browser to success URL (we put in google.com for simplicty)
        callback(null, {
            statusCode: 302,
            headers: {
                Location: completeUrl,
            }
        });
        console.log("End of the ContactForm Process With Success");
    } else {
        console.log("reCaptcha check failed. Most likely SPAM.");
        callback(null, {
            statusCode: '500',
            body: JSON.stringify({
                message: 'Invalid recaptcha'
            })
        });
    }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah membuat proyek, kita perlu mengkompres folder tersebut dalam format ZIP untuk diunggah ke Lambda.&lt;/p&gt;

&lt;p&gt;Saat masih di Lambda Console di Function yang telah dibuat sebelumnya, unggah ZIP dan atur environment variable seperti berikut:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E0eAQCdW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fb23j2x0rqod373cqurt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E0eAQCdW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/fb23j2x0rqod373cqurt.png" alt="environment variable"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kemudian pilih Save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy Restful API Gateway
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka API Gateway Console atau akses &lt;a href="https://console.aws.amazon.com/apigateway/"&gt;disini&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pilih Create API dan pilih REST&lt;/li&gt;
&lt;li&gt;Pilih New API dan masukkan API Name&lt;/li&gt;
&lt;li&gt;Pilih Create API&lt;/li&gt;
&lt;li&gt;Pada navigasi kiri, Pilih Resources dibawah API kamu&lt;/li&gt;
&lt;li&gt;Dari menu dropdown Actions pilih Create Resource&lt;/li&gt;
&lt;li&gt;Masukkan Resource Name seperti contact atau prod kemudian klik Create Resource&lt;/li&gt;
&lt;li&gt;Pada Resource yang baru dibuat, dari menu Action dropdown pilih Create Method&lt;/li&gt;
&lt;li&gt;Pilih Post kemudian checkmark&lt;/li&gt;
&lt;li&gt;Pilih Lambda Function untuk integration type&lt;/li&gt;
&lt;li&gt;Pilih Region yang kamu gunakan pada AWS Lambda&lt;/li&gt;
&lt;li&gt;Masukkan nama function yang dibuat sebelumnya kemudian Save&lt;/li&gt;
&lt;li&gt;[Optional CORS] Pada resource yang baru dibuat, dari dropdown Action pilih Enable CORS kemudian klik enable and replacing&lt;/li&gt;
&lt;li&gt;Pada menu dropdown Actions pilih Deploy API, masukkan Stage Name kemudain pilih Deploy&lt;/li&gt;
&lt;li&gt;Catat dan simpan Invoke URL yang akan dipakai nanti&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Mengatur serverless website
&lt;/h2&gt;

&lt;p&gt;Sebelumnya, kamu dapat menggunakan reCAPTCHA dengan mendaftarkan nama domain &lt;a href="https://www.google.com/recaptcha/admin"&gt;disini&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML
&lt;/h3&gt;

&lt;p&gt;Kita mengikuti dokumentasi Google reCaptcha, yang berarti harus memasukkan code dibawah diantara tag &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; dan &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script src="https://www.google.com/recaptcha/api.js"&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan memasukkan code berikut dibagian bawah form sebelum submit button. Jangan lupa memasukkan siteKey yang didapat setelah mendaftarkan domain pada Google reCaptcha.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxx"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;

&lt;p&gt;Kita dapat menggunakan Ajax untuk melakukan asynchronous HTTP (Ajax) request. Masukkan URL Ajax dengan URL Invoke yang kita dapatkan saat membangun API gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Host Static Website
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Kembali ke S3 Console, pilih bucket yang dibuat sebelumnya&lt;/li&gt;
&lt;li&gt;Upload files website kamu ke dalam bucket&lt;/li&gt;
&lt;li&gt;Setelah selesai, pilih tab Properties&lt;/li&gt;
&lt;li&gt;Pilih Static website hosting&lt;/li&gt;
&lt;li&gt;Isi bagian index dan error dokumen&lt;/li&gt;
&lt;li&gt;Pastikan Block Public access tidak tercentang&lt;/li&gt;
&lt;li&gt;Masih di tab Permissions, Pilih Bucket Policy.
Masukkan policy document berikut ke dalam editor bucket policy, gantikan &lt;code&gt;[YOUR_BUCKET_NAME]&lt;/code&gt; dengan nama bucket yang telah dibuat.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":"*",
         "Action":"s3:GetObject",
         "Resource":"arn:aws:s3:::[YOUR_BUCKET_NAME]/*"
      }
   ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Konfigurasi Domain di Route 53
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Di Amazon Route 53 kita dapat Mendaftarkan domain baru atau menjadikan Route 53 sebagai Layanan DNS untuk domain yang sudah ada&lt;/li&gt;
&lt;li&gt;Saya sudah memiliki domain sendiri, jadi saya menjadikan Amazon Route 53 sebagai Layanan DNS untuk domain saya&lt;/li&gt;
&lt;li&gt;Di &lt;a href="https://console.aws.amazon.com/route53/home?region=us-east-2#hosted-zones:"&gt;Route 53 Console&lt;/a&gt;, pilih Create Hosted Zone.&lt;/li&gt;
&lt;li&gt;Pada panel Create Hosted Zone, masukkan nama domain&lt;/li&gt;
&lt;li&gt;Pada bagian Type, biarkan default pada Public Hosted Zone&lt;/li&gt;
&lt;li&gt;Pilih Create.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Request SSL Certificate di AWS Certificate Manager
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka ACM Console atau akses &lt;a href="https://console.aws.amazon.com/apigateway/"&gt;disini&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;pilih Request a Certificate&lt;/li&gt;
&lt;li&gt;Pilih Request a public certificate&lt;/li&gt;
&lt;li&gt;Add domain name dengan nama domain kamu, contohnya &lt;code&gt;example.com&lt;/code&gt; atau &lt;code&gt;*.example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Kita perlu memvalidasi certificate request, caranya pilih DNS validation atau email validation. Disini saya menggunakan DNS validation karna itu lebih cepat dan mudah.&lt;/li&gt;
&lt;li&gt;Tambahkan CNAME di Amazon Route 53 atau cukup klik tombol di bawah domain kamu untuk menambahkannya secara otomatis.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Buat CloudFront Web Distribution
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Buka CloudFront konsol atau akses &lt;a href="https://console.aws.amazon.com/cloudfront/home"&gt;disini&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Buat distribution&lt;/li&gt;
&lt;li&gt;pilih Origin Domain Name dengan nama bucket yang dibuat sebelumnya.&lt;/li&gt;
&lt;li&gt;Pilih Redirect HTTP to HTTPS&lt;/li&gt;
&lt;li&gt;Pilih Yes dibagian Restrict Bucket Access&lt;/li&gt;
&lt;li&gt;Pada Distribution Settings, gunakan Custom SSL Certificate dan pilih sertifikat yang telah dibuat pada ACM&lt;/li&gt;
&lt;li&gt;Scroll dan temukan Default Root Object, masukkan default file Index.html&lt;/li&gt;
&lt;li&gt;Biarkan lainnya default dan create distribution.&lt;/li&gt;
&lt;li&gt;Tunggu sampai status Deployed, biasanya ini membutuhkan waktu beberapa menit.&lt;/li&gt;
&lt;li&gt;Catat Domain name dari cloudfront&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Menggunakan Custom Domain di Route 53
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Kembali ke Route 53 Console&lt;/li&gt;
&lt;li&gt;Pilih domain yang telah didaftarkan&lt;/li&gt;
&lt;li&gt;Pilih Create Record Set&lt;/li&gt;
&lt;li&gt;Kita akan membuat 2 record set&lt;/li&gt;
&lt;li&gt;Pertama ialah &lt;code&gt;example.com&lt;/code&gt; dan yang kedua adalah &lt;code&gt;www.example.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Gunakan A record dan pilih CloudFront yang telah dibuat.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it, Kita telah membangun serverless static website dengan perlindungan reCaptcha dan notifikasi untuk pemilik atau admin jika ada yang mengirimkan pesan pada form.&lt;/p&gt;




&lt;p&gt;Referensi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AWS Documentations&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>website</category>
      <category>recaptcha</category>
    </item>
  </channel>
</rss>
