কোনও এসএসএইচ ডেমন দ্বারা সুরক্ষার সম্ভাব্য সমস্যাগুলি কী কী?


14

আমি বাইরে থেকে আমার উবুন্টু 10.04 অফিসের পিসিতে এসএসএইচ করতে সক্ষম হতে চাই। আমি এইভাবে পিসিতে একটি এসএসএইচ ডেমন শুরু করার কথা ভাবছি। সুরক্ষার সমস্যাগুলি, সম্ভাব্য বিস্কুট, নির্দিষ্ট কনফিগারেশন সেটিংস ইত্যাদি কী কী সে সম্পর্কে আমার সচেতন হওয়া উচিত?

এটির ক্ষেত্রে এটি গুরুত্বপূর্ণ: এটি কেবলমাত্র আমার নিজের ব্যবহারের জন্য, আমি মনে করি না যে এটি ব্যবহার করার মতো আরও লোক থাকবে; এটি বেশিরভাগ উইন্ডোজ 7 / ভিস্তা / এক্সপি পরিবেশে একটি উবুন্টু 10.04 পিসি।


1
আপনি সম্ভবত ওপেনভিপিএন ইনস্টল করার বিষয়ে বিবেচনা করতে পারেন এবং আপনার এসএসএস সংযোগের জন্য আপনার পিসিতে একটি ভিপিএন টানেল তৈরি করতে পারেন। এইভাবে আপনাকে আপনার ssh বন্দরটি বিশ্বে খোলার দরকার নেই।
Linker3000

@ Linker3000 ধন্যবাদ! আমি এটি একটি চিন্তা করব --- যদিও আমার কিছুক্ষণ আগে ভিপিএন-এর সাথে বেশ অপ্রীতিকর অভিজ্ঞতা ছিল।
ev-br

@ ঝেনিয়া যদি আপনি আপনার "@" এবং ব্যবহারকারীদের নামের জায়গা না রাখেন তবে তারা তাদের জবাব দেওয়ার জন্য আপনার একটি বিজ্ঞপ্তি পাবেন। ;) সুতরাং আমি @ ঝেনিয়া ব্যবহার করার সময় আপনি একটি মন্তব্য পেয়ে যাবেন, তবে আমি @
জেনিয়া

@ ঝেনিয়া এবং এখন আপনি আবার এটি করছেন এক্সডি
ব্লাডফিলিয়া

@ লিংকার, ওপেনভিপিএন কেন এসএসএইচের চেয়ে বেশি সুরক্ষিত সে সম্পর্কে আপনি কিছুটা ব্যাখ্যা করতে পারেন?
আরজান

উত্তর:


20

সবচেয়ে বড় উদ্বেগ হ'ল এসএসএইচ-এর মাধ্যমে কম্পিউটারের প্রশাসক হিসাবে লগ ইন করা লোক। যদি আপনার কাছে পাসওয়ার্ড অনুমান করা সহজ হয় তবে এটি জোর করেই করা যেতে পারে।

আপনি নিতে পারেন এমন বেশ কয়েকটি সুরক্ষা ব্যবস্থা রয়েছে, নীচে এসএসএইচ সার্ভার স্থাপন করার সময় আমি সর্বদা গ্রহণ করি এবং কিছু অতিরিক্ত।

  1. কমপক্ষে (বলুন) 10 টি উচ্চ- এবং ছোট হাতের অক্ষর, সংখ্যা এবং অন্যান্য অক্ষর সমন্বয়ে একটি শক্তিশালী পাসওয়ার্ড ব্যবহার করুন।

  2. জেল ব্যবহারকারীদের তাদের হোম ডিরেক্টরিতে। জেলযুক্ত ব্যবহারকারীরা তাদের হোম ডিরেক্টরি থেকে বাইরে থাকা ফাইলগুলিতে অ্যাক্সেস / সম্পাদনা করতে পারবেন না। সুতরাং আপনার ব্যবহারকারী কী সিস্টেম ফাইলগুলিতে অ্যাক্সেস / সম্পাদনা করতে পারবেন না। কীভাবে কোনও ব্যবহারকারীর কারাগারে রাখা যায় সে সম্পর্কে প্রচুর টিউটোরিয়াল অনলাইনে পাওয়া যাবে। তাদের বেশিরভাগ জেলকিট ব্যবহার করেন । এই জাতীয় টিউটোরিয়ালটির উদাহরণ এখানে পাওয়া যাবে । বিকল্পভাবে, আপনি ওপেনএসএসএইচ-সার্ভারের স্থানীয় ChrootDirectoryনির্দেশিকাও ব্যবহার করতে পারেন । এটির একটি টিউটোরিয়াল উদাহরণ এখানে পাওয়া যাবে

  3. Fail2Ban ইনস্টল করুন । Fail2Ban এমন একটি প্রোগ্রাম যা ভুল এন্ট্রিগুলির জন্য প্রমাণীকরণ লগগুলি পরীক্ষা করে। যখন একটি নির্দিষ্ট সীমা পৌঁছে যায়, এটি নির্দিষ্ট প্রাইস সময়ের জন্য নির্দিষ্ট আইপির জন্য একটি ফায়ারওয়াল ব্লক যুক্ত করে। এসএসএইচ দিয়ে ফেইল 2 ব্যান কীভাবে সেটআপ করা যায় সে সম্পর্কে অনলাইনে বেশ কয়েকটি অনলাইন টিউটোরিয়ালও পাওয়া গেছে, উদাহরণ এটির একটি । Fail2Ban হোমপেজ এছাড়াও কিছু দুর্দান্ত এবং সম্পূর্ণ HOWTOs ধারণ করে।

  4. এসএসএইচ এর মাধ্যমে রুট লগইন অক্ষম করুন। এটি সেই ব্যবহারকারী যা আপনার সিস্টেমে প্রতিটি ফাইলের অ্যাক্সেস পেয়ে যায়, তাই এটির শেল লগইন অক্ষম করার পরামর্শ দেওয়া হয়। উবুন্টুর সর্বশেষতম সংস্করণগুলিতে, মূল ব্যবহারকারী স্বয়ংক্রিয়ভাবে অক্ষম হয়ে গেছে তবে যাইহোক এটির এসএসএইচ অ্যাক্সেস অক্ষম করতে কোনও ক্ষতি করে না। ফাইল সম্পাদনা করে এটি করা হয় /etc/ssh/sshd_configFollowing নীচের লাইনটি দেখুন এবং নিশ্চিত করুন যে এর সামনে কোনও # নেই।

    #PermitRootLogin no
    
  5. একটি অ-মানক বন্দর ব্যবহার করুন (উদাহরণস্বরূপ 22 নয়) এটি হয় আপনার রাউটারে পোর্ট ফরওয়ার্ডিংয়ের মাধ্যমে (যেমন 16121 -> 22 22 -> 22 এর পরিবর্তে 22) বা এসএসএইচ ডিমনকে অন্য কোনও বন্দরে শোনার জন্য তৈরি করা হয়। এটি আপনার এসএসএইচ পরিষেবাটি দূষিত ব্যবহারকারীদের জন্য কম সহজে সনাক্তযোগ্য করে তুলবে। ফাইল সম্পাদনা করে এটি করা হয় /etc/ssh/sshd_configFollowing নীচের লাইনটি সন্ধান করুন এবং আপনি যে কোনও বন্দরটি চান 22 তে পরিবর্তন করুন। আপনার রাউটারের পরে সঠিক পোর্টটি ফরোয়ার্ড করতে ভুলবেন না।

    Port 22
    
  6. লগ ইন করতে পাসওয়ার্ড ব্যবহার করবেন না password পাসওয়ার্ড ছাড়াও, এসএসএইচ প্রাইভেট কী ব্যবহার করে লগইন করতে দেয়। এর অর্থ আপনার কম্পিউটারে একটি কী সঞ্চিত আছে যার উপর আপনি এসএসএইচ মেশিনের এসএসএইচ অ্যাক্সেস করেছেন। কোনও সংযোগ দেওয়ার চেষ্টা করা হলে, এসএসএইচ ক্লায়েন্ট পাসওয়ার্ড প্রমাণীকরণের পরিবর্তে সার্ভারে লগইন করতে কীটি ব্যবহার করে। প্রমাণীকরণ কীগুলি পাসওয়ার্ডের চেয়ে ক্রিপ্টোগ্রাফিকভাবে আরও শক্তিশালী এবং তাই ক্র্যাক করা এত সহজ নয়। এ ছাড়াও আরও অনেক অনলাইন কিভাবে SSH সহযোগে কী ভিত্তিক প্রমাণীকরণ সেট আপ করার সম্পর্কে অনলাইনে খুঁজে পান তবে টিউটোরিয়াল, একটি উদাহরণ হবে এই এক । (আপনি যদি পুটিটিওয়াই উইন্ডোজ থেকে এসএসএইচ করেন তবে একটি পুটি হাওয়ের জন্য এই লিঙ্কটি পরীক্ষা করুন )) কী-ভিত্তিক প্রমাণীকরণ সেট আপ করার পরে আপনি ফাইলটি সম্পাদনা করে পাসওয়ার্ড প্রমাণীকরণ অক্ষম করতে পারবেন /etc/ssh/sshd_config নিম্নলিখিত লাইনটি দেখুন এবং নিশ্চিত করুন যে এর সামনে কোনও # নেই।

    #PasswordAuthentication no
    
  7. Linkচ্ছিকভাবে, @ লিঙ্কার ৩০০০ তার মন্তব্যে যেমন উল্লেখ করেছেন, আপনি যে পিসিটি এসএসএইচ দিয়ে অ্যাক্সেস করতে চান তার জন্য আপনি একটি ভিপিএন টানেল সেট আপ করতে পারেন এবং তারপরে এসএসএইচ সার্ভারে অ-স্থানীয় নেটওয়ার্ক অ্যাক্সেসকে মঞ্জুর করবেন। এইভাবে, ভিপিএন সংযোগ ব্যতীত কোনও বাহ্যিক ডিভাইস আপনার এসএসএইচ সার্ভারটিতে অ্যাক্সেস করতে সক্ষম হবে না। সমস্ত হোস্টকে অস্বীকার করে এবং পরে কেবল স্থানীয় নেটওয়ার্ক আইপিগুলিকে লগইন করার অনুমতি দিয়ে এটি করা যেতে পারে। এটি সম্পাদনা করে /etc/hosts.denyএবং নিম্নলিখিতটি যুক্ত করে করা হয়:

    sshd: ALL
    

    এবং /etc/hosts.allowনিম্নলিখিত যুক্ত করতে:

    sshd: 192.168.1.*
    

    যেখানে আইপি আপনার স্থানীয় নেটওয়ার্কগুলির মধ্যে একটির সাথে মেলে। *একটি ওয়াইল্ডকার্ড, তাই দিয়ে শুরু হওয়া সমস্ত আইপি ঠিকানা 192.168.1.গ্রহণ করা হবে। যদি এটি কাজ না করে তবে আপনার বিতরণটি sshপরিবর্তে ব্যবহার করতে পারে sshd। সেক্ষেত্রে আপনার চেষ্টা করা উচিত ssh: 192.168.1.*এবং ssh: ALLপরিবর্তে।

  8. আপনি শুধুমাত্র নির্দিষ্ট হোস্ট, সঙ্গে একই কাজ অনুমতি দিতে পারে /etc/hosts.allowএবং /etc/hosts.deny6 বর্ণনা অনুযায়ী, কিন্তু /etc/hosts.allowঅ্যাড নিম্নলিখিত লাইন এবং প্রতি হোস্ট স্পেস দ্বারা পৃথক করার অনুমতি:

    sshd: {IP OF HOST TO ALLOW 1} {IP OF HOST TO ALLOW 2} {IP OF HOST TO ALLOW 3} {ETC.}
    
  9. কেবলমাত্র নির্দিষ্ট ব্যবহারকারীদেরই আপনার এসএসএইচ সার্ভারটি অ্যাক্সেস করার অনুমতি দিন। ফাইল সম্পাদনা করে এটি করা হয় /etc/ssh/sshd_configFollowing নীচের লাইনটি দেখুন এবং নিশ্চিত করুন যে এর সামনে কোনও # নেই। এটি উপস্থিত না থাকলে এটি তৈরি করুন। উদাহরণস্বরূপ, আপনি যদি জন, টম এবং মেরিকে কেবল অনুমতি দিতে চান তবে এই লাইনটি যুক্ত / সম্পাদনা করুন:

    AllowUsers john tom mary
    

    আপনি নির্দিষ্ট ব্যবহারকারীদেরও অস্বীকার করতে পারেন উদাহরণস্বরূপ, আপনি যদি জন, টম এবং মেরির অ্যাক্সেস অস্বীকার করতে চান তবে এই লাইনটি যুক্ত / সম্পাদনা করুন:

    DenyUsers john tom mary
    
  10. আগত সংযোগগুলির জন্য কেবল প্রোটোকল এসএসএইচ 2 এর অনুমতি দিন। এসএসএইচ প্রোটোকলের দুটি সংস্করণ রয়েছে। এসএসএইচ 1 সুরক্ষা সম্পর্কিত বিষয়গুলির সাথে তাই এসএসএইচ 2 ব্যবহারের প্রস্তাব দেওয়া হয় is এটি ফাইল সম্পাদনা করে জোর করা যেতে পারে /etc/ssh/sshd_configFollowing নীচের লাইনটি দেখুন এবং নিশ্চিত করুন যে এর সামনে কোনও # নেই। এটি উপস্থিত না থাকলে এটি তৈরি করুন।

    Protocol 2,1
    

    1 টি সরান, তাই লাইনটি হবে

    Protocol 2
    
  11. কোনও পাসওয়ার্ড সেট নেই এমন ব্যবহারকারীদের লগইন করার অনুমতি দিন না। এটি ফাইল সম্পাদনা করে জোর করা যেতে পারে /etc/ssh/sshd_configFollowing নীচের লাইনটি দেখুন এবং নিশ্চিত করুন যে এর সামনে কোনও # নেই। এটি উপস্থিত না থাকলে এটি তৈরি করুন।

    PermitEmptyPasswords no
    
  12. এবং যদিও সাধারণ এবং সম্ভবত বলা বাহুল্য তবে একাধিক ক্ষেত্রে এটি অত্যন্ত গুরুত্বপূর্ণ প্রমাণিত, আপনার সফ্টওয়্যারটি আপ টু ডেট রাখুন। নিয়মিত আপনার ইনস্টল করা প্যাকেজ / সফ্টওয়্যার আপডেট করুন।


= এসএসএইচ কনফিগারেশন ফাইল সম্পাদনা করার পরে, পরিবর্তনগুলি প্রয়োগ করতে ডিমন পুনরায় চালু করতে ভুলবেন না। সম্পাদন করে ডিমন পুনরায় চালু করুন:

sudo /etc/init.d/ssh restart

অথবা

sudo /etc/init.d/sshd restart

আপনি লিনাক্সের কোন বিতরণ ব্যবহার করছেন তার উপর নির্ভরশীল।


2
sudo service ssh restartউবুন্টুতে
ulidtko

@ulidtko এই প্রশ্নটি আরও সাধারণ প্রশ্নের সাথে মিশে গেছে তাই আমি আমার উত্তরকে আরও সাধারণ এবং বিভিন্ন বিতরণের জন্য উপযুক্ত করে তুলেছি। এটি প্রায় সমস্ত বিতরণে কাজ করবে তবে আপনি ঠিক বলেছেন।
ব্লাডফিলিয়া

@ ব্লাডফিলিয়া এই জাতীয় একটি বিস্তারিত এবং অ্যাক্সেসযোগ্য উত্তরের জন্য সম্পূর্ণ প্রচুর ধন্যবাদ! আপনার পয়েন্টগুলিতে আরও দু'একটি প্রশ্ন: ১. ব্যবহারকারীদের কেবল অনুমতি সীমাবদ্ধ করতে জেল খাওয়ার সুবিধা কী? বলুন, একজন 'ব্যবহারকারী' হিসাবে লগ ইন করা আমার কাছে কেবল আমার / ঘরের বাইরের জিনিসগুলিতে অ্যাক্সেস পড়েছি, তবে [উবুন্টু ডিফল্ট অনুসারে, আমি মনে করি] কোনও অ্যাক্সেস লিখতে বা সম্পাদন করে না। কারাগারের চেয়েও ভাল / খারাপ? 2. প্রমাণীকরণ লগগুলি সাধারণত কোথায় থাকে? আমি তাদের ম্যানুয়ালি / গ্রেপ এর মাধ্যমে একবারে পরীক্ষা করতে সক্ষম হতে চাই।
ev-br

@ ব্লাডফিলিয়া ৪. যদি আমি এসএসএসডি কোনও সার্ভারে একটি মানহীন পোর্ট শুনতে পারি, যেমন 1234, তবে ক্লায়েন্টের একটি লিনাক্স কমান্ড লাইন থেকে এই সার্ভারের সাথে সংযোগ করার উপায় কী? মানে, একটি স্ট্যান্ডার্ড এসএসএস কমান্ডের জন্য কি কোনও ধরণের সুইচ দরকার?
ev-br

1
@ জুলিদকো: আপস্টার্ট সহ sudo restart ssh,।
হ্যালো 71

7

কয়েকটি টিপস:

  1. কী ভিত্তিক প্রমাণীকরণ ব্যবহার করুন, যা পাসওয়ার্ডের চেয়ে আরও সুরক্ষিত
  2. কেবল এসএসএইচ 2
  3. রুট লগইন অক্ষম করুন
  4. বিড়ম্বনার জন্য, মানক বন্দর 22 থেকে বন্দরটি পরিবর্তন করুন
  5. সুবিধার্থে, ডিআইএনডিএস বা এর জাতীয় মত আপনার আইপিটিকে ডিএনএস নামের সাথে মানচিত্র করার জন্য একটি সরঞ্জাম ব্যবহার করুন। আপনি একই আইপি দিয়ে দীর্ঘ সময় যেতে পারেন, তবে একবার আপনার ভ্রমণ এবং এটির প্রয়োজন হলে আপনি খুঁজে পাবেন যে আপনি একটি নতুন জারি করেছেন।
  6. অবশ্যই, আপনার ফায়ারওয়ালের মাধ্যমে কেবল এসএসএইচের জন্য প্রয়োজনীয় বন্দরটিকে (22 বন্দর, বা যদি আপনি চান তবে একটি মানক নয়) মঞ্জুরি দিন।

1
পুনরায় 5: আপনার বাড়ির বাইরের কোনও মেশিনে যদি আপনার একটি ইমেল অ্যাকাউন্ট থাকে তবে আপনি আপনার ঘরের মেশিন থেকে সেই ঠিকানায় সময়ে সময়ে একটি বার্তা প্রেরণের জন্য ক্রোন জব সেট আপ করতে পারেন। আপনার বাড়ির আইপি শিরোনামে থাকবে। ডিএনএসের মতো সুবিধাজনক নয়, তবে ব্যবহারযোগ্য।
গ্যারিজন

আপনি আপনার আইএসপির সাথে যোগাযোগ করতে পারেন এবং স্থির আইপি ঠিকানার জন্য দাম চাইতে পারেন। এটি এখন পর্যন্ত সকলের সহজ সমাধান, তবে সাধারণত গতিশীল
ডিএনএসের

2

প্রধান ঝুঁকিটি ভুলে যাওয়া যে আপনি কোনও ssh সার্ভার চালাচ্ছেন এবং কোনও অ্যাকাউন্টে একটি দুর্বল পাসওয়ার্ড রেখেছেন। সেখানে আক্রমণকারী রয়েছে যা নিয়মিতভাবে সাধারণ অ্যাকাউন্টের নাম (যেমন webmasterএবং bob) এবং দুর্বল পাসওয়ার্ড চেষ্টা করে। আপনি পাসওয়ার্ড লগইন বাধা দিত এই ঝুঁকি বাদ দিতে পারে (করা PasswordAuthentication noমধ্যে sshd_config, এবং হয় এছাড়াও করা UsePAM Noবা SSH জন্য পিএএম সেটিংসে পাসওয়ার্ড প্রমাণীকরণ অক্ষম)। কোন মধ্যবর্তী পরিমাপ সঙ্গে ব্যবহারকারীদের একটি শ্বেত তালিকায় SSH লগইন সীমাবদ্ধ করতে হয় AllowUsersবা AllowGroupssshd_config

নোট করুন যে পাসওয়ার্ড লগইন করার অনুমতি দেওয়া নিজেই কোনও সুরক্ষা সমস্যা নয়। দুর্বল পাসওয়ার্ড এবং স্নুপযুক্ত পাসওয়ার্ডগুলি হ'ল সমস্যা এবং এসএসএস সার্ভারে পাসওয়ার্ড প্রমাণীকরণের অনুমতি দেওয়া একটি সক্ষম r পাসওয়ার্ড স্নুপিংয়ের হাত থেকে রক্ষা করতে, এমন কোনও মেশিনে কখনই আপনার পাসওয়ার্ড টাইপ করবেন না যা আপনি পুরোপুরি বিশ্বাস করেন না (তবে তারপরে আপনি যদি কোনও মেশিনকে বিশ্বাস করেন তবে আপনি এটিতে একটি ব্যক্তিগত কী ইনস্টল করতে পারেন এবং তারপরে আপনাকে পাসওয়ার্ড প্রমাণীকরণের প্রয়োজন হবে না)।

কোনও মেশিনে একটি এসএসএস ক্লায়েন্ট ব্যবহার করার সর্বনিম্ন প্রয়োজনীয়তা হ'ল আপনার বিশ্বাস যে এসএসএস যোগাযোগের সক্রিয় হাইজ্যাকিং হবে না (ক্লায়েন্টের মেশিনে চালানো যদি একটি ম্যান-ইন-মধ্য-আক্রমণ সম্ভব হয় - আপনি মনে করেন আপনি একটি মূল ssh ক্লায়েন্টে কমান্ড লিখছেন তবে ক্লায়েন্ট আসলে আপনার প্রমাণীকরণের ডেটা বিশ্বস্ততার সাথে প্রেরণ করছে তবে পরবর্তী সময়ে যোগাযোগের মধ্যে একটি ট্রোজান ঘোড়া প্রবেশ করিয়ে দিচ্ছে)। এটি পাসওয়ার্ড স্নোপার থাকবে না তা বিশ্বাস করার চেয়ে দুর্বল প্রয়োজনীয়তা (সাধারণত একটি কিলোগলারের মাধ্যমে সঞ্চালিত হয়, তবে কাঁধে সার্ফিংয়ের মতো অন্যান্য স্বতঃযুক্ত পদ্ধতি রয়েছে)। আপনার যদি ন্যূনতম বিশ্বাস থাকে তবে তবুও স্নোপারদের ভয় থাকে, আপনি ওয়ান-টাইম পাসওয়ার্ড ব্যবহার করতে পারেন (ওপেনএসএসএইচটি তার পিএএম সমর্থনের মাধ্যমে তাদের সমর্থন করে)।

অবশ্যই, আপনার নিয়ন্ত্রণের বাইরে থাকা মেশিনগুলির সাথে ইন্টারেক্ট করে এমন অন্য কোনও প্রোগ্রাম হিসাবে (কেবল নেটওয়ার্ক সার্ভার নয় ক্লায়েন্টও), আপনাকে অবশ্যই সুরক্ষা আপডেটগুলি অব্যাহত রাখতে হবে।


2

আমার মনে তিনটি জিনিস এসেছে:

  1. আপনি যদি ডিফল্ট পোর্ট 22 খোলেন তবে খুব শীঘ্রই এটি সনাক্ত হয়ে যায় এবং আপনার পিসিটি বর্বর বাহিনীর আক্রমণ দ্বারা ক্ষতিগ্রস্থ হবে। আমি আপনাকে অন্য কোনও বন্দর শোনার জন্য বা আপনার ফায়ারওয়ালে পোর্ট ম্যাপিং করার জন্য sshd কনফিগার করার পরামর্শ দিচ্ছি। যদিও এটি কোনও ম্যাজিক বুলেট নয় এটি অবশ্যই আপনাকে একই সিপিইউ চক্রটি কমপক্ষে সংরক্ষণ করবে।

    পোর্ট 12345

  2. স্পষ্টভাবে পাসওয়ার্ড প্রমাণীকরণ অক্ষম করুন এবং কেবল কী ব্যবহার করুন। আপনার মনে রাখা সবচেয়ে জটিল পাসওয়ার্ডের চেয়ে কোনও কী আরও ভাল।

    পাসওয়ার্ডঅথেন্টিকেশন নং

  3. যদিও উবুন্টু ডিফল্টরূপে রুট ব্যবহারকারী অক্ষম করেছে, স্পষ্টভাবে রুট লগইন অক্ষম করে

    পারমিটরটলগিন নং

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.