<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[cicd]]></title><description><![CDATA[shares experience on Cloud Infrastructure and Security]]></description><link>https://blog.cicd.com</link><image><url>https://substackcdn.com/image/fetch/$s_!3mjf!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F04aa6c5a-aa77-4ca5-a0f5-0e86a35d322f_224x224.png</url><title>cicd</title><link>https://blog.cicd.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 24 Apr 2026 13:48:15 GMT</lastBuildDate><atom:link href="https://blog.cicd.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[cicd.com]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[info@cicd.com]]></webMaster><itunes:owner><itunes:email><![CDATA[info@cicd.com]]></itunes:email><itunes:name><![CDATA[cxmcc]]></itunes:name></itunes:owner><itunes:author><![CDATA[cxmcc]]></itunes:author><googleplay:owner><![CDATA[info@cicd.com]]></googleplay:owner><googleplay:email><![CDATA[info@cicd.com]]></googleplay:email><googleplay:author><![CDATA[cxmcc]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Case for a BFF]]></title><description><![CDATA[Some good reasons for having a BFF (backend-for-frontend) in your stack]]></description><link>https://blog.cicd.com/p/the-case-for-a-bff</link><guid isPermaLink="false">https://blog.cicd.com/p/the-case-for-a-bff</guid><dc:creator><![CDATA[cxmcc]]></dc:creator><pubDate>Mon, 04 Dec 2023 18:52:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3mjf!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F04aa6c5a-aa77-4ca5-a0f5-0e86a35d322f_224x224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>BFF is a type of smart API gateway that has its unique place in modern web services. This article presents several valid arguments in favor of integrating a Backend for Frontend (BFF) into your system.</p><p></p><h4>Performance</h4><ul><li><p>A BFF API has the capability to consolidate multiple API requests to downstream backend services, thereby reducing the number of round trips needed.</p></li><li><p>Reduce the response payload size from downstream services.</p></li></ul><h4>Security</h4><ul><li><p>Redact or remove sensitive payload from downstream services.</p></li></ul><h4>Functionality</h4><ul><li><p>BFF is potentially the best place to implement server push or notifications (such as WebSockets).</p></li><li><p>BFF is the service to store frontend states, which do not make sense for downstream services, for instances:</p><ul><li><p>Which page the user is currently working on.</p></li><li><p>Partially filled form data.</p></li></ul></li><li><p>BFF can host client specific logic that doesn&#8217;t make sense in downstream resource oriented services.</p></li><li><p>BFF can host additional assistance frontend focused features, such as</p><ul><li><p>Autocomplete</p></li><li><p>Search</p></li></ul></li></ul><h4>Productivity</h4><ul><li><p>Reusability: Centralizing frontend business logics.</p><ul><li><p>Devs don&#8217;t need to rewrite the same logic for iOS, Android and Web.</p></li><li><p>Consistency in business logic across platforms improves user experience.</p></li><li><p>Even if platforms have to use distinct logics, BFF helps document them as code in the same service.</p></li></ul></li><li><p>Backend-driven rendering. Enables faster experimentation and bypasses slow iOS/Android release cycles.</p></li><li><p>Faster iteration and autonomy for the frontend team.</p></li></ul><p></p><p>References:</p><ul><li><p>https://samnewman.io/patterns/architectural/bff/, very good article that shares concerns on further implementation tradeoffs.</p></li><li><p>https://learn.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends</p></li></ul>]]></content:encoded></item><item><title><![CDATA[which platforms should your startup use to build software]]></title><description><![CDATA[Considerations]]></description><link>https://blog.cicd.com/p/which-platforms-should-your-startup</link><guid isPermaLink="false">https://blog.cicd.com/p/which-platforms-should-your-startup</guid><dc:creator><![CDATA[cxmcc]]></dc:creator><pubDate>Mon, 07 Aug 2023 07:02:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3mjf!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F04aa6c5a-aa77-4ca5-a0f5-0e86a35d322f_224x224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Considerations</h3><ul><li><p>Startups with limited resources should avoid spending too much effort on managing infrastructure. Resources should be focused on building products.</p></li><li><p>Choose a widely used platform, you do not have time to fix bugs for lesser known platforms.</p></li></ul><h3>Choices</h3><h4>1. Website Builders for Simple Services</h4><p>If your startup doesn't require a dynamic backend or primarily offers simple services, website builders are an excellent choice. Examples:</p><ul><li><p>Webflow</p></li><li><p>Squarespace</p></li></ul><h4>2. PaaS/App Engines for Software Applications</h4><p>If your startup is primarily building software applications to enable your business, and there isn&#8217;t notable requirement on infrastructure performance or security. Recommended choices:</p><ul><li><p>Render</p></li><li><p>Heroku</p></li><li><p>Google App Engine</p></li></ul><h4>3. IaaS with Containerization for Software-Intensive Startups:</h4><p>If your startup is heavily linked to software infrastructure, cloud or has high security expectations. You will likely need engineers that are somewhat familiar with infrastructure at this company in this case. Recommended choices:</p><ul><li><p>AWS EKS</p></li><li><p>AWS ECS</p></li><li><p>GCP GKE</p></li></ul><h3>AWS ECS vs. Kubernetes (EKS, GKE)</h3><ul><li><p>ECS: Although not as popular as Kubernetes, ECS boasts advantages in maintainability and stability. AWS handles ECS's control plane upgrades, making cluster maintenance simpler compared to Kubernetes.</p></li><li><p>Kubernetes: Widely adopted by the open-source community, Kubernetes offers configuration flexibility and supports various open-source applications via Helm charts. However, it requires more attention to version upgrades.</p></li><li><p>Conclusion: If you prefer less infrastructure maintenance and version upgrades, choose ECS. If you prefer configuration flexibility and may install lots of open source tools to work on your applications, then Kubernetes might be a good choice. The flip side is that you may need to take care of the k8s version upgrades from time to time.</p></li></ul><h3>Notable bad choices</h3><ul><li><p>AWS Elastic Beanstalk: The worst app engine platform.</p></li><li><p>Lesser used container platforms: Openshift, Docker Swarm etc.</p></li><li><p>Run your application on one VM.</p></li><li><p>Deploy your own instances that&#8217;s not using a containerization platform.</p></li></ul><p>Ending Note: This blog is served as a general guidance. Your situation may be unique.</p>]]></content:encoded></item><item><title><![CDATA[Defending against Credential Stuffing Attacks]]></title><description><![CDATA[Credential stuffing is an attack where attacker writes a script to automatically make username/password login attempts on a target service, with leaked passwords from other websites.]]></description><link>https://blog.cicd.com/p/defending-against-credential-stuff-attacks</link><guid isPermaLink="false">https://blog.cicd.com/p/defending-against-credential-stuff-attacks</guid><dc:creator><![CDATA[cxmcc]]></dc:creator><pubDate>Mon, 06 Feb 2023 08:11:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3mjf!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F04aa6c5a-aa77-4ca5-a0f5-0e86a35d322f_224x224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Credential stuffing is an attack where attacker writes a script to automatically make username/password login attempts on a target service, with leaked passwords from other websites. If your service uses username/password for login, it may be affected.</p><p>Measures against Credential Stuffing could be categorized into:</p><ul><li><p>Remove usage of passwords (Best)</p></li><li><p>Add friction to login in addition to passwords (Second best)</p></li><li><p>Slow down automated login attempts (Easy, but not so useful)</p></li></ul><p>Here is a list of countermeasures in the order of preference.</p><ol><li><p>Replace password login with password-less login.</p><ul><li><p>Difficulty: &#128295;&#128295;&#128295; (client, server-side changes)</p></li><li><p>Effectiveness: &#127775;&#127775;&#127775;&#127775;&#127775; <strong>best solution,</strong> <strong>completely solves the problem</strong></p></li><li><p>Comment: If password is no longer accepted, credential stuffing attack no longer works. Password-less login is relatively easy to implement.</p></li><li><p>Considerations:</p><ul><li><p>Password-less login requires client changes. Mobile client changes will require a force client upgrade.</p></li><li><p>Email/Social login is preferred. Phone SMS login causes other issue because phone number could be rotated.</p></li><li><p>Remember to remove password login API endpoint.</p></li></ul></li></ul></li><li><p>Implement multi-factor authentication</p><ul><li><p>Difficulty: &#128295;&#128295;&#128295;&#128295;&#128295; (client, server-side changes)</p></li><li><p>Effectiveness: &#127775;&#127775;&#127775;&#127775; greatly reduced risks</p></li><li><p>Comment: 2FA denies attacker the access to sensitive info with password only.</p></li><li><p>Considerations:</p><ul><li><p>2FA adds friction to user experience. Consider using adaptive MFA (only prompt if new device or location) to reduce friction if possible. Or only require 2FA for sensitive activities.</p></li><li><p>2FA implementation may also require client-side change. 2FA adds a lot of logic into the login process, it&#8217;s difficult to get right (handle the situation where your second factor is lost, for example).</p></li></ul></li></ul></li><li><p>Deny usage of leaked passwords</p><ul><li><p>Difficulty: &#128295;&#128295; (server-side changes only)</p></li><li><p>Effectiveness: &#127775;&#127775;&#127775; the solution is only as good as your password list</p></li><li><p>Comment: Collect a list of leaked passwords and reject passwords on the list. This could use the help of a bloom filter.</p></li></ul></li><li><p>Implement CAPTCHA to slow down automation</p><ul><li><p>Difficulty: &#128295;&#128295;&#128295;&#128295; (client, server-side changes)</p></li><li><p>Effectiveness: &#127775;&#127775;&#127775; denies automation but manual attack is still possible</p></li><li><p>Comment: CAPTCHA makes automated validation of passwords more difficult.</p></li><li><p>Considerations:</p><ul><li><p>CAPTCHA implementation requires client-side changes.</p></li><li><p>CAPTCHA only makes the automated attacks manual or difficult to automate.</p></li></ul></li></ul></li><li><p>Rate limit, IP-based blocking or risk-score based blocking of attempts.</p><ul><li><p>Difficulty: &#128295; (server-side changes only)</p></li><li><p>Effectiveness: &#127775; easy to bypass</p></li><li><p>Comment: Setting up rule-based blocking or rate-limit is simple. However it&#8217;s also not difficult to by-pass with the use of proxies. Determined attacker can find ways around within days. It&#8217;s a cat-and-mouse game.</p></li></ul></li><li><p>Strong password policies</p><ul><li><p>Difficulty: &#128295; (server-side changes only)</p></li><li><p>Effectiveness: &#127775; barely helps</p></li><li><p>Comment: Strong passwords also get leaked on other websites.</p></li></ul></li></ol><p>Honorable mentions of detective measures:</p><ul><li><p>Notifying user with new logins.</p></li><li><p>System monitoring of abnormal login attempts.</p></li></ul><h4>Conclusion</h4><p>A number of common measures against Credential Stuffing attacks are discussed here. The best solution is to completely remove the usage of passwords. If removing password isn&#8217;t possible, a combination of measures could be implemented. Server-side only measures are easy to implement but usually less effective. Measures involving client-side changes, however, alter the user flow and takes a longer time to implement.</p>]]></content:encoded></item><item><title><![CDATA[Avoid the Term: Microservice]]></title><description><![CDATA[&#8220;Microservice&#8221; started as a noble trend of breaking apart monolithic applications.]]></description><link>https://blog.cicd.com/p/avoid-the-term-microservice</link><guid isPermaLink="false">https://blog.cicd.com/p/avoid-the-term-microservice</guid><dc:creator><![CDATA[cxmcc]]></dc:creator><pubDate>Mon, 30 Jan 2023 08:07:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3mjf!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F04aa6c5a-aa77-4ca5-a0f5-0e86a35d322f_224x224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#8220;Microservice&#8221; started as a noble trend of breaking apart monolithic applications. A few years in, the term has become another engineering buzzword that leads to confusion. Two individuals discussing microservices may have vastly different interpretations of the term.</p><h4>Dangerous Overemphasis on &#8220;Micro&#8220;</h4><p>You may have seen examples of overly-micro services in an organization near you. Another engineer may blindly implement the concept of "microservices" without fully understanding the implications. This could lead to unforeseen issues.</p><p>Sideeffects caused by extremely micro services include:</p><ul><li><p>System load overhead. More services mean more connections between services, fewer resources being shared.</p></li><li><p>Management overhead. Unifying system configurations for huge amount of services is a daunting task, especially for those organizations that don&#8217;t have a thousand-people infra team like Google.</p></li><li><p>Increased cognitive load. Workload for documentation and onboarding is increased.</p></li><li><p>Increased complexity leading to outages. Complex systems pose greater challenges for troubleshooting and increase the likelihood of cascading failures.</p></li><li><p>Weird career incentives. Some engineers see creating a new service as a way to get a better performance rated or promoted.</p></li></ul><h4>When it&#8217;s OK to be Slightly More &#8220;Micro&#8221; </h4><p>My advice for startups is always: start with monolith, break apart when necessary. Valid reasons to break apart monolithic include but not limited to:</p><ul><li><p>The components are owned by functionally separate teams. Break apart application to increase development velocity.</p></li><li><p>The components have different performance profiles. Some components autoscales more rapidly than some other components. They may need to be written in different programming languages to improve performance.</p></li><li><p>The components should be located in separate locations. For example, public facing vs in a private subnet.</p></li><li><p>The components have different deployment schedules or risk profiles.</p></li></ul><h4>What to Replace the Term with</h4><h5>&#8220;Service-Oriented Architecture (SOA)&#8221;</h5><p>When referring to a system architecture style that&#8217;s loosely coupled, SOA is much more specific and delivers clearer meaning.</p><h5>&#8220;Service&#8221;</h5><p>When referring to the individual application itself, &#8220;service&#8221; is usually sufficient to convey the message. You can break apart a monolithic application into two services, which are not necessarily &#8220;microservice&#8221;.</p><h4>Conclusion</h4><p>Decomposing a monolithic application isn&#8217;t always right or wrong, it&#8217;s dependent on the situation. The term "microservice" has become a vague buzzword that can lead to hasty implementation with unintended consequences. You have the choice of using terms with clearer definitions.</p>]]></content:encoded></item><item><title><![CDATA[Integrating Google Sign-In for Web Applications, the Security Considerations]]></title><description><![CDATA[Google Sign-In is one of the most popular third-party login methods.]]></description><link>https://blog.cicd.com/p/integrating-google-sign-in-for-web</link><guid isPermaLink="false">https://blog.cicd.com/p/integrating-google-sign-in-for-web</guid><dc:creator><![CDATA[cxmcc]]></dc:creator><pubDate>Tue, 03 Jan 2023 17:59:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3mjf!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F04aa6c5a-aa77-4ca5-a0f5-0e86a35d322f_224x224.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Google Sign-In is one of the most popular third-party login methods. Google Sign-In is my personally favorite Sign-In method as a security-conscious user. Google invested heavily into security of their identity platform, implementing features including adaptive 2FA, detection of anomalous activities etc. Google never recycles Gmail addresses. It&#8217;s safer than using your own domain, which may expire after a person fails to renew it (for example, domain owner passes away).</p><p>Compared to other social login methods, Google Sign-In has clear advantages:</p><ul><li><p>Facebook Login. Facebook is usually not accepted by SaaS software. I am also concerned about friend list exports. Maybe you are not granting the permission, but your friend may give the 3rd party site about the connection.</p></li><li><p>Sign in with Apple. Limited adoption and web experience.</p></li><li><p>Sign in with Twitter, Sign In with LinkedIn, Login with Amazon, etc. Limited adoption.</p></li></ul><p>In addition, Google Sign-In provides a superior sign-up and login experience, reduces friction and potentially increases conversion. In many cases, either for SaaS applications or consumer-facing applications, implementing Google Sign-In would be a good idea for your business.</p><p>The following content describes common security considerations we came across when integrating Google Sign-In.</p><h3>Gmail Address Normalization</h3><p>An open secret about Gmail accounts is that each account has many aliases. For example, the following email addresses are considered the same account on Google:</p><ul><li><p>j.o.h.n.d.o.e@gmail.com</p></li><li><p>johndoe@gmail.com</p></li><li><p>JOHNDOE@gmail.com</p></li><li><p>johndoe+123@gmail.com</p></li><li><p>johndoe@googlemail.com</p></li></ul><p>If your web application has not already normalized Gmail addresses. It may be a good idea to normalize them before implementing Google Sign-In. It affects the way how existing email-identified accounts will be merged with the new login method.</p><h3>Incorrect Interaction with Password Login</h3><p>An attack scenario for account takeover could happen if the web application allows email-password sign up without email verification.</p><ul><li><p>The victim isn&#8217;t a user of your web app. Attacker creates an account using the victim's email johndoe@gmail.com, and a password. The account email confirmation isn't yet activated.</p></li><li><p>The victim johndoe@gmail.com then signs up again using Google Sign-In. The victim put their information into the account.</p></li><li><p>The attacker may be able to log in using the password they created. The Attacker now may view the victim&#8217;s personal information.</p></li></ul><p>There are a few possible ways to avoid the takeover vulnerability.</p><ul><li><p>Disable password login once Google Sign-In is linked to the account.</p></li><li><p>Reset password once Google Sign-In is linked to the account.</p><ul><li><p>Email confirmation completed cases: send a "security alert" telling the user that the existing account is linked with Google Sign-In.</p></li><li><p>Email confirmation incomplete cases: revoke existing password associated with the account, send a "security alert" to tell the user that their password is reset due to Sign-In. The user needs to go through the password reset flow if they want to use a password again.</p></li></ul></li></ul><h3>Verification of Authentication Tokens</h3><p>Google has provided <a href="https://developers.google.com/identity/sign-in/web/backend-auth#verify-the-integrity-of-the-id-token">guidance</a> on verification of their &#8220;id token&#8221; returned by the sign-in process. However the backend server may have a faulty implementation that leads to security issues. Common cases of problem:</p><ul><li><p>Lack of verification of client_id in token. Attacker uses a token from another phishing app they created.</p></li><li><p>Lack of verification of user_id (sub) in token. Your mobile/web app could pass a user_id alongside with the oauth2 token optimistically, but no verification of these two matching.</p></li><li><p>Lack of verification of the "email_verified" field. Not sure if this is really exploitable, but I hope the field should always be true.</p></li><li><p>Lack of checking expiration of the token.</p></li></ul><p>To reduce potential mistakes, it&#8217;s recommended to use well-known verification libraries, especially those that are designed specifically for Google Sign-In.</p><h3>Sign In With Apple Implementation May be Required</h3><p>According to <a href="https://developer.apple.com/app-store/review/guidelines/#sign-in-with-apple">App Store Review Guidelines</a>, if you have any social login method integrated, the app needs to offer &#8220;Sign in with Apple&#8221; to get app review passed on iOS. As the guideline text says:</p><blockquote><p>Apps that use a third-party or social login service (such as Facebook Login, Google Sign-In, Sign in with Twitter, Sign In with LinkedIn, Login with Amazon, or WeChat Login) to set up or authenticate the user&#8217;s primary account with the app must also offer Sign in with Apple as an equivalent option.</p></blockquote><p>This requirement adds to the complexity of integration. Especially with Apple&#8217;s <a href="https://support.apple.com/en-us/HT210425">Hide My Email</a> functionality. Your application may need to consider situations where your application may not receive the users&#8217; primary email addresses.</p>]]></content:encoded></item></channel></rss>