Saladpuk.com
🏆 เนื้อหาหลัก
🏆 เนื้อหาหลัก
  • 💖สลัดผัก
  • 📰มีอะไรใหม่บ้าง
    • 2020
      • 2020-11
      • 2020-10
      • 2020-09
      • 2020-08
      • 2020-03
      • 2020-02
      • 2020-01
    • 2019
      • 2019-12
      • 2019-11
      • 2019-10
      • 2019-09
      • 2019-08
  • 🤔อ่านเรื่องไรดี ?
  • มือใหม่หัดเขียนโค้ด
    • 👶เขียนโค้ดด้วยภาษา C#
      • เกิดมาไม่เคยเขียนโค้ดมาก่อนเบย
      • 👶พื้นฐาน
        • 1.โปรแกรมที่ต้องลง
        • 2.โครงสร้างของโค้ด
        • 3.ชนิดของข้อมูล
        • 4.การสร้างตัวแปร
        • 5.คำสั่งพื้นฐาน
        • 6.การแปลงข้อมูล
        • 7.การเปรียบเทียบค่า
        • 8.การตัดสินใจด้วย IF statements
        • 9.การตัดสินใจด้วย Switch statements
        • 10.การทำงานซ้ำๆด้วย While
        • 11.การทำงานซ้ำๆด้วย Do While
        • 12.การทำงานซ้ำๆด้วย For
        • 13.การแก้โจทย์จากรูป
        • 14.มารู้จักกับ Array กัน
      • 🧑ระดับกลาง
        • 15.Value type vs Reference type
        • 16.ลดงานซ้ำๆด้วย Method
        • 17.มารู้จักกับ Class & Field กัน
        • 18.มารู้จักกับ Constructor กันบ้าง
        • 19.มาเขียน Method ใน Class กัน
        • 20.มารู้จักกับ Property กัน
        • 21.ลองใช้คลาสแบบจริงจังบ้าง
        • 22.การสืบทอด Inheritance
        • 23.Polymorphism
        • 24.Abstract Class
        • 25.Interface
        • 26.Namespace
        • 27.Enum
        • 28.Exception handler
        • 29.ลงลึกกับ string
        • 30.StringBuilder เพื่อนคู่ string
      • 👨⏳ระดับสูง
        • Generic
        • Delegates
        • Action & Func
        • Lambda expression
        • LINQ
        • พระคัมภีร์การใช้คำสั่ง LINQ
      • 💡Tips
        • 💡C# version 8.0
        • 💡Boxing & Unboxing
    • 👶Algorithm
      • 👾Algorithm Big-O
      • 👽Algorithm P & NP
    • 👦OOP
      • 💖Abstraction
      • 💖Encapsulation
      • 🏆Abstraction & Encapsulation
      • 💖Inheritance
      • 💖Polymorphism
      • 🏆Inheritance & Polymorphism
      • 📝ลองเขียน OOP ดูดิ๊
      • 👑OOP + Power of Design
      • 🥰เทคนิคในการออกแบบ
    • 👶บทสรุปฐานข้อมูล
      • เก็บรูปในฐานข้อมูล
      • Database indexing
      • การลบข้อมูล
    • 👦Communication Patterns
    • 👦Design Patterns
      • 🤰Creational Patterns
        • 🏭Factory Method
        • 🏭Abstract Factory
        • ☝️ Singleton Pattern
        • 🏗️ Builder Pattern
        • 🎎Prototype Pattern
      • 🧱Structural Patterns
        • 🔌Adapter Pattern
        • 📪Proxy Pattern
  • Puzzle
    • 🧠Challenges
      • 🐴Google ม้า 25 ตัว
      • 🌉Amazon เสา 2 ต้น
      • 🥇ทองเก๊
      • 💊ยาต้านโควิด
      • 🎩CP หมวก 5 ใบ
      • 🧓Einstein's Riddle 01
  • พื้นฐานที่ควรต้องรู้
    • 🐳Docker
      • 📦Docker Containers
      • 🃏Docker Exercise 01
      • 🛠️ Docker Tools
      • 🗃️ Docker Registry
      • 🖼️ Container Image
      • 📢Docker Push
      • 🔄WSL
    • 👶Clean Code
      • 🧓Uncle Bob - Clean Code
      • 🧓Uncle Bob - Comments
      • 🧓Uncle Bob - Naming
      • 🧓Uncle Bob - Mindset
      • 🧓Uncle Bob - TDD
    • 👶Code Smells
    • 👶สิ่งที่คนเขียนโค้ดมักเข้าใจผิด
    • 👶AI พื้นฐาน
    • 👶Git พื้นฐาน
      • Git branching strategy
    • 👶Cloud พื้นฐาน
    • 👶UML พื้นฐาน
      • Activity Diagram
      • Class Diagram
      • Sequence Diagram
      • Use case Diagram
      • บทสรุปการใช้ UML
    • 👶Data Scientist
      • การเลือก Algorithms ให้ AI (1/5)
      • การเตรียมข้อมูลให้ AI (2/5)
      • หลักการตั้งคำถามให้ AI (3/5)
      • แฉความลับของ AI Model (4/5)
      • หัดเขียน AI จาก AI ของคนอื่น (5/5)
    • 👶DevOps พื้นฐาน
    • 👶Docker ขั้นพื้นฐาน
      • Image and Container
      • แชร์ Docker Image ที่สร้างไว้
    • 👶Microservices พื้นฐาน
      • Microservices ที่ดีมีลักษณะยังไง
      • Microservices Tips
      • จาก Monolith สู่ Microservices
    • 👶ความรู้พื้นฐานในการทำเว็บ
    • 👦Bottlenecks of Software
      • หัวใจที่สำคัญที่สุดของฐานข้อมูล
    • 👦Agile Methodology
      • Agile in a Nutshell
      • Software Development Life Cycle
      • Code Review
    • 👦Security พื้นฐาน
      • การเก็บรหัสผ่านที่ถูกต้อง
      • Security in actions
        • Hash function
      • Security Principles
      • 😎The Matrix 1
      • 😎The Matrix 2
      • HTTPS in a nutshell
    • 👦SOLID Design Principles
      • มารู้จักกับ SOLID กันดีกว่า
      • Single-Responsibility Principle
      • Open/Closed Principle
      • Liskov Substitution Principle
      • Interface Segregation Principle
      • Dependency-Inversion Principle
  • Cloud Computing
    • 👶Microsoft Azure 101
      • สมัคร Microsoft Azure
      • รู้จักกับ Resource Groups
      • สร้างเว็บตัวแรกกัน
      • สร้าง Virtual Machine กัน
      • ประเภทของคลาว์เซอร์วิส
      • มาสร้าง Logic App กัน
      • มาสร้าง Function App กัน
      • คลาว์คิดเงินยังไง ?
      • Cloud Native
      • Guideline for Cloud scaling
      • Auto Scaling
    • 👶Azure App Services
    • 👶App Service Plan
    • 👶Azure Storage
      • Blob storage
        • ลองสร้างที่เก็บไฟล์กันเลย
        • เข้าใจ Blob storage ให้มากขึ้น
        • ลองเขียนโค้ดอัพโหลดไฟล์กันบ้าง
        • สร้างเว็บจากที่ฝากไฟล์บนคลาว์
    • 👶Azure Bot Service
      • Bot เข้าใจเราได้ยังไงกันนะ
    • 👶Azure Cognitive Services
      • การสร้าง Cognitive Services
      • การ Login ด้วยใบหน้า
      • อ่านลายมือจากรูปเป็นตัวอักษร (OCR)
      • เขียน AI แยกของต่างๆทำยังไง?
      • เขียนแอพ ทายอายุ บอกเพศ ง่ายจิ๊ดเดียว
      • เขียนแอพให้ AI อธิบายรูปเป็นภาษาคน
    • 👶Machine Learning Studio
      • มาสร้าง AI ของแท้ตัวแรกของเรากัน
      • สร้าง AI ตัดสินใจอนุมัติบัตรเครดิต 💳
      • ลองเรียกใช้ AI ของเรากัน
    • 👶Azure Service Fabric
      • สร้าง Service Fabric กัน
    • 👶Blockchain
      • Blockchain ทำงานยังไง ?
      • Consensus Algorithm คืออะไร ?
      • สร้าง Blockchain ใช้เองกัน !
      • หัดเขียน Smart Contract กัน
    • 👶Power BI
    • 👶Azure Web App
      • เซิฟเวอร์บนคลาว์ ราคา? ต่าง?
    • 👶Azure DevOps
      • เล่น Azure DevOps กัน
      • เล่นกับ Repository
      • ลองทำ Continuous Integration (CI)
      • ลองทำ Continuous Delivery (CD)
      • เล่น Kanban Board
    • 🤠Cloud Playground
      • การป้องกันความลับหลุดตอนที่ 1
      • การป้องกันความลับหลุดตอนที่ 2
      • การป้องกันความลับหลุดตอนที่ 3
      • การป้องกันความลับหลุดตอนจบ
  • Software Testing
    • 👦Test-First Design
    • 👦Test-Driven Development
      • 1.มารู้จักกับ TDD กันดีกว่า
      • 2.Test cases เขาเขียนกันยังไงนะ
      • 3.เครื่องมือในการทดสอบ
      • 4.การใช้ Theory และ InlineData
      • 5.โค้ดที่ทดสอบได้
      • 6.Mantra of TDD
      • 7.Functional & None-Functional testing
      • 8.Manual vs Automation testing
      • 9.Automation Frameworks in .NET
      • 10.Mock Framework
      • 11.มาเรียนการใช้ Moq กันเถอะ
      • 12.สรุป
  • Web
    • 👦Web API
      • 1.Web API คืออะไร
      • 2.ติดตั้ง .NET Core SDK
      • 3.สร้าง Web API ตัวแรกกัน
      • 4.Verbs
      • 5.Swagger เพื่อคู่ API
      • 6.การใช้ Model
      • 7.เรียก Web API ผ่าน Postman
      • 8.มาจัดกลุ่ม API กัน (1/2)
      • 9.มาจัดกลุ่ม API กัน (2/2)
  • Software Design
    • 🤴Design Patterns
      • 🦈Creational patterns
        • Abstract Factory
        • Builder
        • Factory Method
        • Prototype
        • Singleton
      • 🦈Structural patterns
        • Adapter
        • Bridge
        • Decorator
        • Facade
        • Proxy
      • 🦈Behavioral patterns
        • Chain of Responsibility
        • Command
        • Iterator
        • Mediator
        • Memento
        • Observer
        • State
        • Strategy
        • Template Method
        • Visitor
Powered by GitBook
On this page
  • 😘 ทวนปัญหา
  • 💔 รายการที่ต้องแก้
  • 😘 เข้าใจให้ตรงกันก่อน
  • ❤️ หัวใจหลัก (สำคัญมากใช้ต่อหลายบทเลย)
  • 🤠 เก็บ Secret ไว้บน Cloud Configuration
  • 🎯 สรุปคร่าวๆก่อนไปต่อ

Was this helpful?

Export as PDF
  1. Cloud Computing
  2. Cloud Playground

การป้องกันความลับหลุดตอนที่ 2

🤔 การเก็บรหัสลับบนคลาว์ เขาทำกันยังไงนะ ?

Previousการป้องกันความลับหลุดตอนที่ 1Nextการป้องกันความลับหลุดตอนที่ 3

Last updated 5 years ago

Was this helpful?

😘 ทวนปัญหา

ในบทความก่อนหน้าเราก็ได้เห็นปัญหาคร่าวๆแล้วว่า ถ้าเราเก็บ ความลับ ไว้ได้ไม่หมด มันก็จะไม่ใช่ความลับอีกต่อไป และแม้แต่เราจะจำกัดสิทธิ์ให้เฉพาะ คนระดับนี้เท่านั้นถึงจะเข้าถึงข้อมูลพวกนั้นได้ แต่สุดท้ายถ้าเข้าถึงได้มันก็คือ ไม่ใช่ความลับอยู่ดี ดังนั้นในรอบนี้เราจะมาต่อกันว่าเราจะแก้ปัญหาที่ว่ามายังไงกันต่อดี โดยปัญหาที่เรายังค้างกันอยู่คือ

หมายเหตุ ผมขอใช้คำว่า Secret แทนคำว่า ความลับ นะ เพราะอ่านคำว่าความลับแล้วมันจั๊กจี้ยังไงก็ไม่รู้ แต่ให้เข้าใจตรงกันก็คือ มันเป็นของที่สำคัญที่ใช้ในการเข้าระบบอื่นๆ เช่น ฐานข้อมูล, API, Token บลาๆ นั่นเอง

💔 รายการที่ต้องแก้

  • การผัง Secret ไว้เป็น Hard code ทำให้เราต้อง Build & Deploy โปรเจคใหม่เท่านั้น

  • ใน Source code ของมี Secret ติดเข้าไปใน commit เสมอ

  • Developer บางคนอาจจะรู้ Secret ซึ่งเขาอาจจะเป็นคนร้ายในอนาคต หรือ เป็นจุดที่อันตรายถ้าเขาเก็บมันไว้ไม่ดี

  • (ยังไม่หมดนะ อ่านไปเรื่อยๆเดี๋ยวมันจะถูกเติมต่ออยู่)

ซึ่งจากรายการที่ลิสต์มาจะเหลืออยู่ข้อเดียว ดังนั้นเดี๋ยวเรามาลองแก้ปัญหาข้อนี้กัน (แล้วเราจะเพิ่มปัญหาถัดไปต่อ ฮี่ๆ)

แนะนำให้อ่าน บทความนี้เป็นส่วนหนึ่งของคอร์ส ที่จะพาเพื่อนๆแมวน้ำทั้งหลายได้ลองมาดูว่า การสร้างโปรเจคเพื่อทำงานบนคลาว์ โดยใช้มาตรฐานสากลจริงๆแล้วเขาทำกันยังไง ส่วนถ้าสนใจอยากอ่านต่อก็กดไปที่ลิงค์สีฟ้าๆได้เลย

ส่วนถ้าอยากอ่านบทความก่อนหน้าให้อ่านได้จากลิงค์นี้เบย **[การป้องกันความลับหลุดตอนที่ 1*](***

😘 เข้าใจให้ตรงกันก่อน

การกันไม่ให้คนอื่นเห็นความลับแม้กระทั่งคนในทีม นั้นสามารถทำได้หลายท่ามาก ดังนั้นเราจะค่อยๆทำให้ดูกันทีละแบบนะ ซึ่งแต่ละแบบนั้นจะเหมาะสมกับสถานะการณ์ไม่เหมือนกัน ซึ่งก็เลือกพิจารณาเองละกันว่างานเราเหมาะที่จะใช้ในระดับไหน ไม่งั้นเราจะเอารถถังไปไล่จับตั๊กแตนนั่นเอง

❤️ หัวใจหลัก (สำคัญมากใช้ต่อหลายบทเลย)

แต่ในจุดนี้ผมอยากให้เข้าใจตรงกันก่อนว่า โดยปรกติเราจะไม่เขียนโค้ดสดต่อตรงเข้ากับตัว database ที่ใช้กับงานจริงมีลูกค้าใช้งานอยู่จริงนะจ๊ะ (ซึ่งหลายๆคนก็รู้ว่ามันไม่ดี แต่ในบางทีก็เลี่ยงไม่ได้ ... เดี๋ยวจะบอกวิธีแก้เรื่องนี้ในบทความถัดๆไปว่ามาตรฐานสากลเขาทำกันยังไง) เพราะ Developer ควรจะต้องทำงานกับ Development Environment หรือพูดง่ายๆก็คือของจำลองนั่นเอง เพราะเราจะเขียนโค้ดให้มันทำงานผิดๆถูกๆยังไงก็ได้ ก็จะไม่มีผลกับงานที่มีคนใช้จริงนั่นเอง ส่วนงานที่มีลูกค้าใช้อยู่จริงเราเรียกมันว่า Production Environment งุยล่ะ

จากที่ว่ามาถ้าเข้าใจ concept นี้แล้วเราก็จะมี Environment 2 แบบนั่นเอง ดังนั้นเราก็จะมี Secret 2 ตัว ตามนี้

  1. Development Secret - มีไว้แจกให้ developer ใช้งาน เช่น connection string เอาไว้ต่อ database ตัวทดสอบ

  2. Production Secret - มีไว้ให้เซิฟเวอร์รู้เท่านั้นไม่แจกให้ใครเด็ดขาด เพราะ ข้อมูลบนนั้นไม่ควรมีคนเข้าถึงได้

จากที่ร่ายยาวมาตัว Development Secret เราก็จะแจกให้ developer ที่เกี่ยวข้องเอาไปกำหนดใส่ Environment Variables ในเครื่องตัวเองเพื่อใช้เชื่อมต่อกับระบบทดสอบนั่นเอง

ดังนั้นเราก็จะมาลองดูกันว่าเจ้า Production Secret นั้นมันมีท่าในการจัดการยังไงบ้างนั่นเอง

🤠 เก็บ Secret ไว้บน Cloud Configuration

สำหรับคนที่อยากใช้ Visual Studio Code เอาเว็บขึ้นคลาว์ก็ไปติดตั้ง Extension ตัวนี้นะแล้ว Login ก็จะสามารถใช้คำสั่ง Deploy ขึ้นคลาว์ได้เลย

หลังจากที่เอาขึ้นคลาว์เรียบร้อยละ เราก็ลองเรียก api ของเราทดสอบกันดู ซึ่งสิ่งที่ได้ก็คือ

สาเหตุที่เราได้ ABCDEFG ก็เพราะว่าตัว asp.net core มันไปอ่าน Environment Variables แล้วมันไม่เจอตัวแปร DbConnectionString ยังไงล่ะ (เพราะเรายังไม่ได้กำหนดไว้บนคลาว์) มันเลยไปใช้ค่าจากไฟล์ appsettings.json แทนนั่นเอง

ดังนั้นคราวนี้เราก็จะลองไปกำหนดค่า Secret ไว้บนคลาว์กันดูบ้าง โดยที่เมนูด้านซ้ายของตัวเว็บของเรา มันจะมีเมนูที่ชื่อว่า Configuration อยู่นั่นเอง ให้จิ้มมันลงไปอย่างแผ่วเบา 1 ที

มันก็จะเปิดแสดง Configuration ที่เป็น Secret ที่สำคัญต่างๆออกมาให้เราดูทั้งหมดนั่นเอง ซึ่งในรอบนี้เราจะลองเพิ่ม Secret ใหม่ของเราไปลง ก็ทำการกดที่ปุ่ม + New application setting ลงไปอย่างแผ่วเบาเช่นเคย ตามรูปด้านล่าง

หลังจากนั้นก็ทำการกำหนดชื่อตัวแปรและค่าของมันลงไป (ตั้งชื่ออะไรไว้ก็ใช้ชื่อนั้นนะ ในตัวอย่างผมใช้ชื่อเป็น DbConnectionString นั่นเอง) หลังจากกำหนดเสร็จก็กดปุ่ม OK

สุดท้ายก็ทำการกดปุ่ม Save ก็จะเป็นการเสร็จสิ้นพิธีกรรม

ไหนลองเรียก api ตัวเดิมของเรากันดูดิ๊

ซึ่งตามรูปด้านบนเราก็จะเห็นว่าค่าที่ได้นั้นมันเป็นค่าที่อยู่บนคลาว์เท่านั้น ซึ่งค่านี้ Developer ที่ไม่มี access เข้าถึง service บนคลาว์ก็จะไม่มีทางเข้ามาเห็นนั่นเอง

🎯 สรุปคร่าวๆก่อนไปต่อ

ตอนนี้เราสามารถแยก Secret ออกเป็นแต่ละ Environment ได้อย่างง่ายๆแล้ว โดยที่ Developer ก็ไม่จำเป็นต้องมาคอยเปลี่ยน ConnectionString พวกนี้ไปๆมาๆละ (บางทีเปลี่ยนผิดสลับ Production secret กับ Development secret อีกจะบ้าตาย)

ซึ่งวิธีการในบทความนี้ก็ยังไม่สามารถแก้ปัญหาเรื่องนี้ได้ 100% เพราะว่า

  • ถ้ามีคนที่มี access เข้าถึง service บนคลาว์ตัวนั้นๆได้ เขาก็สามารถเข้ามาดู secret เหล่านั้นได้เหมือนเดิม

  • ถ้าเราไม่ให้ access เข้าถึง service ตัวนั้นๆ เราก็จะเอาแอพขึ้นคลาว์ไม่ได้

แต่เรื่องการ deploy งานขึ้นคลาว์นั้นเราสามารถแก้ไขได้ง่ายๆโดยการใช้ Build pipeline หรือ CI/CD นั่นเอง ดังนั้นปัญหาทั้งหมดของเราก็จะเหลือตามนี้

  • การผัง Secret ไว้เป็น Hard code ทำให้เราต้อง Build & Deploy โปรเจคใหม่เท่านั้น

  • ใน Source code ของมี Secret ติดเข้าไปใน commit เสมอ

  • Developer บางคนอาจจะรู้ Secret ซึ่งเขาอาจจะเป็นคนร้ายในอนาคต หรือ เป็นจุดที่อันตรายถ้าเขาเก็บมันไว้ไม่ดี

  • ถ้ามีคนที่มี access เข้าถึง service บนคลาว์ตัวนั้นๆได้ เขาก็สามารถเข้ามาดู secret เหล่านั้นได้เหมือนเดิม

  • ถ้าเราไม่ให้ access เข้าถึง service ตัวนั้นๆ เราก็จะเอาแอพขึ้นคลาว์ไม่ได้

ดังนั้นเดี๋ยวเราไปดูบทความถัดไปกันเลยดีกว่า ว่าเราจะแก้ปัญหาเรื่องนี้ต่อยังไงดี

หลังจากที่เราได้ลองเก็บความลับไว้ใน Environment Variables ที่อยู่ภายในเครื่องของเราละ ซึ่งตัวเว็บ asp.net core มันจะอ่านค่าพวกนั้นเอาไปใช้งานผ่าน IConfiguration ตามตัวอย่างที่แล้ว () แต่คราวนี้ถ้าเราเอาตัวเว็บของเราไป deploy ไว้บนคลาว์แล้วจะเกิดอะไรขึ้น ? ... ดังนั้นผมก็จะเอาตัวเว็บที่สร้างไว้ในบทที่แล้วลองเอาขึ้นคลาว์ดูบ้างนะ

แนะนำให้อ่าน สำหรับคนที่ไม่เคยเอาเว็บไปไว้บนคลาว์เลยก็สามารถลองทำตามได้ง่ายๆด้วยบทความนี้ครัช **[สร้างเว็บตัวแรกกัน*](***

แนะนำให้อ่าน สำหรับแมวน้ำท่านไหนสนใจบทความว่าการทำ Build pipeline หรือ CI/CD นั้นเขาทำกันยังไง ก็สามารถเข้าไปดูได้จากลิงค์ 2 ตัวนี้นะขอรับ กับ ซึ่งทั้ง 2 บทความนั้นเป็นส่วนหนึ่งของ **[👶 Azure DevOps**]() ซึ่งจะสอนการใช้ DevOps ตั้งแต่ขั้นพื้นฐานให้เพื่อนๆนั่นเอง

ชอบ เกลียด โกรธ พบเนื้อหาผิด อ่านแล้ว งง อยากถาม ก็เข้ามาคุยกับ ดช.แมวน้ำ ได้ที่ นะฮ๊าฟ ฝากกดไลค์กดแชร์ด้วยก็ดีนะครับ 😍

🤠
🤠 Cloud Playground
https://www.saladpuk.com/cloud/cloud-playground/app-config-01)\
จำไม่ได้กดตรงนี้เพื่อกลับไปดู
https://www.saladpuk.com/cloud/azure101/website)\
Continuous Integration (CI)
Continuous Delivery (CD)
https://www.saladpuk.com/cloud/azure-devops
Saladpuk Facebook